用于调用函数的可变参数模板

时间:2014-03-06 12:40:46

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

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

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");

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

1 个答案:

答案 0 :(得分:0)

我建议稍微改写一下这样的事情:

#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用于区分左值和右值。通常,通过将函数指针(或一般可调用对象)作为常规函数参数传递而不是作为显式模板参数来使用参数推导也更好。