【发布时间】:2019-05-22 07:52:50
【问题描述】:
我想将一个指向函数的指针存储为成员变量,该函数可以接受可变数量的不同类型的参数。
我一直在尝试使用的基本结构是这样的
template <typename... Args>
using ArgsFuncPointer = void(*)(Args...);
template<typename... Args> void varArgsFunc(Args&&... args) { }
{
ArgsFuncPointer<int, float> funcPointer = varArgsFunc;
funcPointer(1, 2.0);
}
问题是varArgsFunc不能转换成ArgsFuncPointer<int, float>
请参阅coliru 了解(非)工作示例。
最终我希望能够做类似的事情:
template <typename... Args> class Foo
{
public:
Foo(Args&&... args)
{
func(args);
}
VarArgsFuncPointer func;
}
更新
事实证明,它无法编译的原因是ArgsFuncPointer 和varArgsFunc 之间的签名存在细微差别。对于ArgsFuncPointer,参数包通过右值引用传递,而对于varArgsFunc,参数包通过值传递。
这行得通:
template <typename... Args>
using ArgsFuncPointer = void(*)(Args&&...);
template<typename... Args> void varArgsFunc(Args&&... args) { }
{
ArgsFuncPointer<int, float> funcPointer = varArgsFunc;
funcPointer(1, 2.0);
}
工作示例here
【问题讨论】:
标签: c++ parameter-passing