C++ 将类成员函数传递给其他类

C++ Pass class member function to other class

本文关键字:其他 函数 成员 C++      更新时间:2023-10-16

我有一个类wrapper,它包含类trigger的意图。我想将wrapper的成员函数传递给trigger,以便在某些事件上trigger可以调用此类函数,从而对wrapper实例产生影响。可以做到吗?

我对代码的想法是这样的:

class trigger {
public:
trigger(int trigger_thr): _trigger_thr(trigger_thr){};
trigger &operator+=(int v) {
_trigger_value += v;
check_trigger();
return *this;
}
void set_callback(someType f){
_f = f;
}
private:
int _trigger_value;
int _trigger_thr;
someType _f;
void check_trigger() {
if (_trigger_value >= _trigger_thr)
_f();
}
};
class wrapper {
public:
wrapper() {
_t.set_callback(someType some_function)
}
private:
void some_function() {/* do something */}
private:
trigger _t;
}

引用成员函数的语法是&wrapper::some_function。这将创建一个指向成员函数的指针,该指针可以传递给另一个函数并进行存储。它的类型将是void (wrapper::*)()的,要调用该函数,您必须有一个类型为wrapper的对象(您不能只在 THIN AIR 上调用成员函数,您需要一个对象(。因此,要将其传递给触发器类,您还需要传递一个可以调用函数的wrapper*。给定一个类型为wrapper*的指针p和一个指向类型void (wrapper::*)()的成员m的指针,您可以将其称为(p->*m)()这是最丑陋和最难记住的C++语法形式之一。

或者,您可以使用 lambda 表达式创建一个闭包对象,该对象捕获对象并调用成员函数:

set_callback( [this] { this->some_function(); } );

要将闭包对象存储在成员变量中,您需要使用一个可以存储任何无需参数即可调用的可调用对象的std::function<void()>

因此,将函数参数和成员从someType更改为std::function<void()>,然后在调用set_callback时使用 lambda 表达式。然后,您可以像在当前代码中一样_f()调用它。

将 someType 替换为std::function<void()>,并在wrapper的构造函数中,给触发器一个调用适当方法的 lambda:

// in class trigger
void set_callback(std::function<void()> f) {
_f = f;
}
// in class wrapper
wrapper() {
_t.set_callback([this](){ some_function(); });
}