我正在尝试编写一个如下所示的模板函数:
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/