我正在尝试构建一个简单的类来环绕函数并调用(可能返回)它们而不传递任何值,除非在构造类期间。然而,这个问题是我似乎无法达到必要的模糊程度。我的示例代码如下:
template< typename T, typename... Arguments>
struct FunctionPtrWrapper
{
FunctionPtrWrapper(T(*funcIn)(Arguments...), Arguments... args)
{
funcPtr=std::bind(funcIn, args...);
}
void go()
{
funcPtr();
}
std::function< T(Arguments...)> funcPtr;
};
它可以很好地编译甚至在传递不带参数的函数时运行,但是当传递一个需要参数的函数时,如果调用 go() 它将编译失败,因此:
FuctionPtrWrapper<void> pointerOne(&foo);
pointerOne.go();
完美运行,但是:
FunctionPtrWrapper<void, char> pointerTwo(&foo, 'c');
pointerTwo.go();
编译失败,出现以下错误:
error: no match for call to '(std::function< void(char)>) ()
我假设这意味着在构造函数中,参数无法扩展并传递给对 std::bind 的调用。这是语法错误、对所用函数的误用还是根本不可能?
最佳答案
您的 std::bind
调用绑定(bind)了所有参数,因此它返回的函数对象应该在没有参数的情况下被调用。
因此,std::function
的类型参数应该总是T()
,而不是T(Arguments...)
:
std::function<T()> funcPtr;
Demo .
关于c++ - 在 Variadic 模板类中使用 std::bind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25801337/