c++ - 在 Variadic 模板类中使用 std::bind

标签 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 的调用。这是语法错误、对所用函数的误用还是根本不可能?

最佳答案

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

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

std::function<T()> funcPtr;

Demo .

关于c++ - 在 Variadic 模板类中使用 std::bind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25801337/

相关文章:

c++ - 变量和对象创建的范围

python - 如何使用模板(例如 Jinja2)将列值列表呈现到表中

c++ - 管理标准容器中的抽象类

c++ - 从 C++ 代码创建单独的 QML 窗口

c++ - 更改dll对windows的依赖

c++ - 处理超出 ASCII 范围的字符

C++ 模板,不同的声明和定义,链接器无法解析符号

c++ - 类方法的显式特化 - 符号已定义

c++ - 高效地使用函数输出

c++ - 可变模板构造函数优先级