C++ C++;使用模板类调用非静态成员函数

C++ C++;使用模板类调用非静态成员函数,c++,templates,member-function-pointers,C++,Templates,Member Function Pointers,我试图使用模板类作为回调的解决方法。我想对回调使用非静态成员函数 我创建了两个类: //First Class class AbstractAction { public: AbstractAction() = default; virtual ~AbstractAction() = 0; virtual void exec() = 0; }; //Second class template<class T> class Action: public Abstract

我试图使用模板类作为回调的解决方法。我想对回调使用非静态成员函数

我创建了两个类:

//First Class
class AbstractAction
{
public:
  AbstractAction() = default;
  virtual ~AbstractAction() = 0;

  virtual void exec() = 0;
};

//Second class
template<class T>
class Action: public AbstractAction
{
public:

  Action<T>(T* obj, void (T::*func)())
  : class_obj_(obj), class_func_(func) {}

  virtual void exec() {class_obj_->*class_func_;}

private:
  T * class_obj_;
  void (T::*class_func_)();

};
编辑说:

In instantiation of 'void display::Action<T>::exec() [with T = HardWork]':
error: invalid use of non-static member function of type 'void (HardWork::)()'
   virtual void exec() {class_obj_->*class_func_;}
                        ^~~~~~~~~~
在“void display::Action::exec()[with T=HardWork]”的实例化中:
错误:无效使用“void(HardWork::)()”类型的非静态成员函数
虚拟void exec(){class_obj_uj->*class_func_;}
^~~~~~~~~~
他为什么抱怨这件事?他有一个指向实际工作对象的指针,所以他应该知道该调用什么。第二,也是更重要的一点,我有什么办法。我不想使用静态工作环境。我有什么选择?

当你这样做时

class_obj_->*class_func_;
您取消了对函数指针的引用,但实际上并没有对其执行任何操作。你仍然需要像平常一样给职能部门打电话。不过,您确实需要添加一些额外的括号来完成此操作,这看起来像

virtual void exec() { (class_obj_->*class_func_)();}
                      ^^^^^get function^^^^^^^^^ ^
                                                 | call function 

为了避免通过成员函数指针调用的混乱语法,可以从C++17开始使用:

virtual void exec() {
    std::invoke(class_func_, class_obj_);
}

这看起来不像是一个可重复的例子,但我可能错了。你忘了实际调用:
class\u obj\uuj->*class\u func\uu
->
(class\u obj\uj->*class\u func)(
我在网络中找到它,没有括号。我试着在结尾加上括号,但不是两个都加。不,它在工作。非常感谢。
virtual void exec() {
    std::invoke(class_func_, class_obj_);
}