使用部分可变参数调用函数

2023-11-30

考虑我有以下内容:

void bar(int a, int b)
{
}   

template<typename F, typename... Args>
void foo(F function, Args... args>
{
    function(args...);
}

我希望有某种方法只将必要数量的参数传递给函数,以便我能够执行以下操作,这应该会导致以 1、2 作为参数调用 bar,而丢弃 3。不知道传入的函数类型 F 需要多少个参数。

foo(bar, 1, 2, 3);
foo([](int a, int b){}, 1, 2, 3);

当我尝试使用以下功能特征时:

namespace detail
{
    template<typename F, std::size_t... Is, class Tup>
    void call_discard_impl(F&& func, std::index_sequence<Is...>, Tup&& tup) 
    {
        std::forward<F>(func)(std::get<Is>(tup)...);
    }
}

template<typename F, typename... Args>
void call_discard(F&& func, Args&&... args)
{
    detail::call_discard_impl(std::forward<F>(func),
        std::make_index_sequence<function_traits<F>::num_args>{},
        std::forward_as_tuple(args...));
}

I get:

error C2510: 'F': left of '::' must be a class/struct/union
error C2065: '()': undeclared identifier
error C2955: 'function_traits': use of class template requires template argument list

On:

template <typename F>
struct function_traits : public function_traits<decltype(&F::operator())>
{}

我确实让成员函数版本正常工作,不需要函数特征:

namespace detail
{
    template<typename O, typename R, typename... FunArgs, std::size_t... Is, class Tup>
    void call_discard_impl(O* obj, R(O::*mem_func)(FunArgs...), std::index_sequence<Is...>, Tup&& tup)
    {
        ((*obj).*mem_func)(std::get<Is>(tup)...);
    }
}

template<typename O, typename R, typename... FunArgs, typename... Args>
void call_discard(O* obj, R(O::*mem_func)(FunArgs...), Args&&... args)
{
    detail::call_discard_impl(obj, mem_func,
        std::make_index_sequence<sizeof...(FunArgs)>{},
        std::forward_as_tuple(args...));
}

首先,使用以下代码可以查找 lambda 或函数引用的数量:

template <typename T>
struct function_traits : public function_traits<decltype(&T::operator())>
{};

template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const>
{
    using result_type = ReturnType;
    using arg_tuple = std::tuple<Args...>;
    static constexpr auto arity = sizeof...(Args);
};

template <typename R, typename ... Args>
struct function_traits<R(&)(Args...)>
{
    using result_type = R;
    using arg_tuple = std::tuple<Args...>;
    static constexpr auto arity = sizeof...(Args);
};

接下来,您使用元组包转发可变参数,并且仅扩展到函数的数量:

template<typename F, std::size_t... Is, class T>
void foo_impl(F && f, std::index_sequence<Is...>, T && tuple) {
    std::forward<F>(f)(std::get<Is>(tuple)...);
}

template<typename F, typename... Args>
void foo(F && f, Args&&... args) {
    foo_impl(std::forward<F>(f),
             std::make_index_sequence<function_traits<F>::arity>{},
             std::forward_as_tuple(args...) );
}

实例:http://coliru.stacked-crooked.com/a/3ca5df7b55c427b8.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用部分可变参数调用函数 的相关文章

随机推荐

  • Ruby x,y = gets.split.map &:to_i

    我对这行 ruby 代码感到困惑 为什么赋值给 x y 而不是单个变量 x y gets split map to i 这将数组中的第一个条目分配给x 第二个条目y与分配给单个变量相反 在这种情况下 数组将分配给该变量 将多个变量放在赋值的
  • VS安装项目:在不同目录中安装文件

    我有 Visual Studio 安装项目 我想将我的文件之一安装到驱动器 C 上的某个目录 我该怎么做 一个例子 我正在将我的应用程序安装在 C MyApp 中 以及一个文件 settings ini 到 C Settings MyApp
  • 分配给 Setparent(..) 后 Showmodal 出现问题

    我创建了两个应用程序 MainApps 和 SubApps SubApps 有一个模式类型对话框 例如登录 注销表单等 并且工作正常 将其附加到 MainApps 后 模态对话框显示为正常的框形式 它的行为类似于 DIALOG SHOW 而
  • Google登录API:强制输入密码?

    我在我的网站上使用了多个社交提供商 包括 Google 每次用户请求我的一项操作时 我都会询问 Google 帐户的密码 这是出于安全原因 通过 Facebook 我们可以发送auth type reauthenticate范围 Googl
  • 使用具有不同 xlabel 的 Pandas 绘制日期时间条形图

    我想绘制一个条形图 其中带有条形图的 pandas DataFrame 的每一列中只有几个数据条目 这是成功的 但它不仅有错误的 y 轴限制 而且还使 x 刻度间隔非常紧密 使得图表毫无用处 我想将步速更改为大约每周左右 并且仅显示日 月和
  • CKEditor:设置光标/插入符位置

    如何在 CKEditor 3 x 中定位插入符号 我有 2 个位置 我想在这两个位置上使用 insert HTML 伪代码 editor setCaret 20 function does not exists editor insertH
  • CSS 不适用于 django 密码表单字段

    我从网上下载了一个CSS模板 我能够将除密码字段和按钮样式之外的所有内容链接到我的 Django 代码 我错过了什么步骤 我已阅读 Django 文档 并且正在使用 attr 方法将 css 属性添加到我的 Django 表单字段 在我的P
  • 如何在 Linux/OS X 上打印 wstring?

    我怎样才能打印这样的字符串 a c e 在控制台 屏幕上 我试过这个 include
  • 为什么当我执行performSelectorInBackground:时没有自动释放池?

    我正在调用一个在后台线程中运行的方法 self performSelectorInBackground selector loadViewControllerWithIndex withObject NSNumber numberWithI
  • 每个 Flash 上传器都会给出错误的进度值

    我去年初为内部网站编写的文件上传脚本在许多机器上表现得很奇怪 在某些机器上它始终工作正常 而在其他机器上它始终表现不佳 我在使用 YUI Uploader SWFUpload 2 2 和 2 5a 和 Uploadify 时遇到完全相同的问
  • MutableLiveData 中 setValue() 和 postValue() 的区别

    有两种方法可以使变化值MutableLiveData 但有什么区别setValue postValue in MutableLiveData 我找不到相同的文档 这里是班级MutableLiveData安卓的 package android
  • 改变矩阵维度

    让我们举一个可复制的例子 这是我的初始矩阵 d lt matrix 1 80 5 d 1 2 3 4 5 1 1 17 33 49 65 2 2 18 34 50 66 3 3 19 35 51 67 4 4 20 36 52 68 5 5
  • 在 asp net mvc 5 中使用会话变量进行授权

    所以我的项目需求发生了变化 现在我想我需要构建自己的操作过滤器 所以 这是我当前的登录控制器 public class LoginController Controller GET Login public ActionResult Ind
  • 如何随机均衡不相等的值?

    假设我有多个不相等的值 a b c d e 是否可以仅通过随机数生成将这些不相等的值变成相等的值 示例 a 100 b 140 c 200 d 2 e 1000 我希望算法随机定位这些集合 以便最常定位最大值 而大多数情况下只保留最小值 我
  • 当列类型为 nvarchar 时,将表与列值总和一起旋转

    我有一个具有以下结构的表 我想转置它 BookId Status 123A Perfect 123B Restore 123C Lost 123D Perfect 123A Perfect 123B Restore 123A Lost 12
  • rpy2 在 Windows 7 上安装

    我试图在我的计算机上安装 rpy2 但无法做到这一点 我下载了源码包 并尝试使用命令安装Rpy2 rpy2 2 3 2 python setup py install 这是结果 running install running build r
  • 我想获取 SD 卡中的音频文件

    在我的应用程序中我想设置ringtone当我接到来电时 如何打开SDCARD并得到音频文件并列出它 如何获得URI对于所选的audio file MediaScanner 为您查找音乐 填充 MediaStore 数据库 下面是一些查找音乐
  • 使用可选参数和命名参数解决歧义

    我的项目有两种方法 定义如下 void Person int ID double height 0 0 string team Knights my codes void Person int ID double height 0 0 st
  • 如何组合两个机器学习算法的输出?

    如果我有两个非常不同的数据集和两种非常不同的分类技术 是否有一个很好的方法来组合这两个输出 我知道平均值可能有效 但有没有更相关的方法来做到这一点 我听说过一些概念 例如增强学习和集成学习 这些概念是否适用 解决这个问题有两种一般方法 第一
  • 使用部分可变参数调用函数

    考虑我有以下内容 void bar int a int b template