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++的新手,也许有一种简单的方法可以将数据发送到覆盖类,方法是从类内触发它,我只是还没有看到它。

但是,是的,如前所述,我不知道,非常感谢一些建议。

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);