c++ - 调用函数的可变参数模板

标签 c++ function templates c++11 variadic-templates

我正在尝试编写一个如下所示的模板函数:

template<T FuncPtr, Params...>
void CallFunction(Params...)
{
    FuncPtr(Params...);
}

示例用法:

typedef void (__stdcall* Test_t)(int a1, bool a2, char* a3);
Test_t fn = ....; //pointer obtained somehow

CallFunction<fn>(10, true, "Hello");

这样的事情可能吗?我不知道如何使用参数包将其解包,以便包服务器的每个成员都作为参数。

最佳答案

我建议小幅重写成这样:

#include <iostream>

template<class Fun, class... Args>
void CallFunction(Fun fun, Args&&... args)
{
    fun(std::forward<Args>(args)...);
}

void fn(int a1, bool a2, char const* a3)
{
    std::cout << a1 << a2 << a3;    
}

int main() 
{
    CallFunction(fn, 10, true, "Hello");
}

Live Example .我认为您可以从中推断出正确的 ... 语法(在参数列表中的 class... 之后,但在 arg... 用于在调用站点解包参数。

std::forward 是为了区分左值和右值。一般来说,通过将函数指针(或一般的可调用对象)作为常规函数参数而不是作为显式模板参数传递来使用参数推导也更好。

关于c++ - 调用函数的可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22224855/

相关文章:

visual-studio - 如何在运行时列出函数的所有调用?

c++ - 我可以在不知道类型参数的情况下持有 shared_ptr 吗?

asp.net-mvc-3 - 可重用的编辑器模板,带有用于业务对象的 DropDownList

c++ - 运行 cmake 后出现 undefined reference 错误

c++ - 内部/外部标题分离

c++ - 在游戏开发中使用杂波

c++ - 是否真的使用了使用指针类型实例化模板的能力?

c++ - 哪种数据结构按插入排序并具有快速的 “contains”检查?

c++ - 如何错误处理命令行参数?

r - 对 n*m 矩阵的所有列组合进行函数运算,生成 m*m 结果