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_);
}