[英]Using std::bind in Variadic Template Classes
我正在尝试构建一个简单的类来包装函数并调用(可能返回)它们而不传递任何值,除非在构造类时。 然而,问题在于我似乎无法达到必要的模糊程度。 我的示例代码如下:
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
调用绑定了所有参数,因此应该在没有参数的情况下调用它返回的函数对象。
因此, std::function
的类型参数应始终为T()
,而不是T(Arguments...)
:
std::function<T()> funcPtr;
演示 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.