gpt4 book ai didi

c++ - 以方便的方式在 C++ 中使用方法作为回调

转载 作者:行者123 更新时间:2023-11-28 00:20:46 26 4
gpt4 key购买 nike

我想将方法​​用作回调。我知道有一种非常通用的语法允许使用任何类型的可调用对象作为回调:

void f(int x) { cout << "f("<<x<<")" << endl; }

class C
{
public:
void m(int x) { cout << "C::m("<<x<<")" << endl; }
};

class C2
{
public:
void registerCallback(function<void(int)> f)
{
v.push_back(f);
}

private:
vector<function<void(int)>> v;

void callThem()
{
for (int i=0; i<v.size(); i++)
{
v[i](i);
}
}
};

int main()
{
C2 registrar;

C c;
registrar.registerCallback(&f); // Static function
registrar.registerCallback(bind(&C::m, &c, placeholders::_1)); // Method

getline(cin, string());

return 0;
}

请注意,必须可以将任何类型的类的方法注册为回调。

不过,我希望允许使用以下更方便的语法来注册方法:

registrar.registerCallback(&C::m, c); // Method

是否可以提供一个 registerCallback() 重载,允许更基本的语法,而无需在注册方法时使用 bind

最佳答案

如果你想要那种语法,我认为你可以轻松地将它包装在重载中:

   template <typename Func, typename Obj>
void registerCallback(Func f, Obj& obj)
{
registerCallback(bind(func, &obj, placeholders::_1));
}

关于c++ - 以方便的方式在 C++ 中使用方法作为回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27624333/

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