繁体   English   中英

在Variadic模板类中使用std :: bind

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM