【问题标题】:Can std::function be a class data member?std::function 可以是类数据成员吗?
【发布时间】:2018-03-20 17:52:12
【问题描述】:

我有以下简单的代码:

template<class R, class... Args> class CallBack {
protected:
    std::function<R(Args...)> myFunc;

public:
    CallBack(std::function<R(Args...)> funcIn) : myFunc(funcIn) {}

    virtual ~CallBack() {}

    R call(Args... args) {
        return myFunc(args...);
    }
};

int main() {
    std::function<int(int,int)> tmp = [](int y, int z){return y + z + 2;};
    CallBack<int(int,int)> x(tmp);
    std::cout << x.call(12, 7);
    return 0;
}

但是,它只是不起作用。我明白了:

../src/main.cpp:17:28: error: function returning a function
  std::function<R(Args...)> myFunc;
                            ^

我检查了std::function的原型,它是一个简单的类,为什么我不能将它用作我的类CallBack的属性?

在我的 main 中,我可以实例化一个 std::function&lt;int(int,int)&gt; 类型的对象,那么有什么区别?他们对std::function有特殊限制吗?

【问题讨论】:

  • 什么是类属性?
  • 试试这个return myFunc( std::forward&lt;Args&gt;(args...) );
  • 你打错了:CallBack&lt;int(int,int)&gt; 应该是CallBack&lt;int, int, int&gt;
  • 或者你的班级应该是template &lt;typename &gt; class CallBack; template&lt;class R, class... Args&gt; class CallBack&lt;R(Args...)&gt; {/*..*/};
  • @Jarod42:你说得对,我试图模仿 std::function 但只是忘记了它的声明的结尾......

标签: c++ function class


【解决方案1】:

您的语法错误。在定义中 template&lt;class R, class... Args&gt; class CallBack - R 匹配 int(int,int) 并且 Args... 为空。

如果你想要CallBack的这个签名,你必须做这样的事情:

CallBack<int,int,int> x(tmp);

【讨论】:

  • 确实!非常感谢!
猜你喜欢
  • 2016-05-28
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 2012-08-22
相关资源
最近更新 更多