作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将方法用作回调。我知道有一种非常通用的语法允许使用任何类型的可调用对象作为回调:
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/
在javascript中,我可以这样写 console.log( person.name || person.nickname || '-' ) 然后会先查找name字段,如果找不到,会回退到nick
在为通用接口(interface)编写回调时,定义他们自己负责创建和访问的本地数据可能很有用。 在 C 中,我只使用一个空指针,类 C 示例: struct SomeTool { int ty
我是一名优秀的程序员,十分优秀!