我正在尝试构建一个简单的类来包装函数并调用(可能返回)它们而不传递任何值,除非在构造类时。然而,问题在于我似乎无法达到必要的模糊程度。我的示例代码如下:
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的调用。这是一个语法错误,滥用所使用的功能还是根本不可能?
答案 0 :(得分:3)
您的std::bind
调用绑定了所有参数,因此应该在没有参数的情况下调用它返回的函数对象。
因此,std::function
的类型参数应始终为T()
,而不是T(Arguments...)
:
std::function<T()> funcPtr;