gpt4 book ai didi

c++ - 使用 std::bind 和 std::function 将类成员函数用作另一个类成员例程的回调

转载 作者:搜寻专家 更新时间:2023-10-31 01:24:40 25 4
gpt4 key购买 nike

这可能以前已经探索过,但我不确定它是如何工作的,以及在我的特定情况下应该如何......

基本上我有一个类,回调定义为:

class Foo
{
public:
using someCallbackName = std::function<void(int)>;
void someFunc();
Foo(int, someCallBackName);
private :
someCallbackName m_callBack;
}

void Foo::someFunc()
{
m_callBack(1);
}

我过去常常在 main() 中调用它,或者只是引用类似签名的函数..

void someOtherFunction(int x)
{
cout << x;
}

int main()
{
Foo::someCallbackName callBack = someOtherFunction;
Foo foo(5, callBack);
}

虽然我决定,我可能需要 someOtherFunction 作为类成员,并将其作为类的一部分。但是,使用类成员函数 someOtherFunction 作为回调需要将其设为静态,这工作正常,但这意味着它无法访问非静态类成员,这有点违背了把它放在一个类中。

我尝试使用: C++ callback using class member

和中给出的结构访问: https://en.cppreference.com/w/cpp/utility/functional/bind

..但它似乎不起作用,std::bind 到

Foo::someCallbackName callBack = std::bind(not_sure_what_to_use_here);

一直报错说没有合适的转换,这让我觉得代码中的回调签名或使用 std::bind 的机制是错误的。

保持类 Foo 不变,m_callBack 如何调用 someOtherFunction

最佳答案

您可以使用 labmda 将回调“绑定(bind)”到特定对象的非静态成员函数:

class X {
public:
void someOtherFunction(int x) const { std::cout << x; }
};

int main()
X x;
Foo::someCallbackName callBack = [&x](int i){ x.someOtherFunction(i); };
Foo foo(5, callBack);
foo.someFunc();
}

现场演示:https://wandbox.org/permlink/fUmrnD6xn1xr7zn0 .


为了避免在 x 被销毁后出现悬空引用,您可以使用共享指针,如下所示(注意它是通过捕获的):

Foo::someCallbackName callBack;
{
auto ptr_x = std::make_shared<X>();
callBack = [ptr_x](int i){ ptr_x->someOtherFunction(i); };
}
Foo foo(5, callBack);
foo.someFunc();

现场演示:https://wandbox.org/permlink/23euPcuDUsDENdRe .

关于c++ - 使用 std::bind 和 std::function 将类成员函数用作另一个类成员例程的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57904835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com