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

时间:2014-09-12 05:25:59

标签: c++ templates c++11 variadic-templates

我正在尝试构建一个简单的类来包装函数并调用(可能返回)它们而不传递任何值,除非在构造类时。然而,问题在于我似乎无法达到必要的模糊程度。我的示例代码如下:

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的调用。这是一个语法错误,滥用所使用的功能还是根本不可能?

1 个答案:

答案 0 :(得分:3)

您的std::bind调用绑定了所有参数,因此应该在没有参数的情况下调用它返回的函数对象。

因此,std::function的类型参数应始终为T(),而不是T(Arguments...)

std::function<T()> funcPtr;

Demo