C++事件处理
本文关键字:事件处理 C++ | 更新日期: 2023-09-27 18:35:39
我想在标准C++(UNIX)中实现类似C#的事件处理,如以下代码:
public class connection{
public delegate void Message(object sender, string text);
public event Message doMessage = null;
//called from within a Thread or something alike
private void MessageReceived(string Message){
if (this.doMessage != null)
{
this.doMessage(this, Message);
}
}
}
public class Main{
Connection con;
public Main()
{
this.con = new Connection();
this.con.doMessage += con_doMessage;
}
void con_doMessage(object sender, string message)
{
txtMain.Text = txtMain.Text + Environment.NewLine + message;
}
}
我用谷歌搜索了我的指尖血腥,但我发现只是事件在放电,而不是像我的例子那样的覆盖类。
事实上,我是标准C++的新手,也许有一种简单的方法可以将数据发送到覆盖类,方法是从类内触发它,我只是还没有看到它。
但是,是的,如前所述,我不知道,非常感谢一些建议。
使用 std::function
作为回调:
void printSomething() { std::cout << "event!" << std::endl; }
int main() {
std::function<void()> onEvent;
onEvent = &printSomething;
onEvent(); // prints "event!"
}
<小时 />如果需要 C# 样式的委托,请使用std::vector<std::function<...>>
:
struct Delegate {
std::vector<std::function<void()>> funcs;
template<class T> Delegate& operator+=(T mFunc) { funcs.push_back(mFunc); return *this; }
void operator()() { for(auto& f : funcs) f(); }
};
int main() {
Delegate delegate;
delegate += []{ std::cout << "hello, "; };
delegate += []{ std::cout << "world!" << endl; };
delegate(); // prints "hello, world!"
}
或者只是复制我的ssvu::Delegate
类,可在此处获得。
这与最近的一个问题相关或相同。你可以在那里查看我的答案。简而言之,比构建自己的基础设施更完整/经过测试的解决方案可能是 Boost.Signals2。
使用std::function
可能足以满足几乎所有用例的需求。如果您确实需要多个事件接收器,请查看我编写的multifunction
(多播委托)概念证明。
它允许您编写语法类似于 C# 的代码:
void f(int n) { cout << "f: " << n << "'n"; }
util::multifunction<void(int)> event;
event += f;
event += [](int n) { cout << "[]: " << n << "'n"; };
event(42);