【问题标题】:C++ Event HandlingC++ 事件处理
【发布时间】:2013-10-15 13:39:26
【问题描述】:

我想在标准 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++ 的新手,也许有一种简单的方法可以将 Data 获取到覆盖类,方法是从类中触发它,但我还没有看到它。

但是,是的,如前所述,我不知道,如果您提供一些建议,我将不胜感激。

【问题讨论】:

    标签: c# c++ events unix delegates


    【解决方案1】:

    使用std::function 作为回调:

    void printSomething() { std::cout << "event!" << std::endl; }
    
    int main() {
        std::function<void()> onEvent;
        onEvent = &printSomething;
        onEvent(); // prints "event!"
    }
    

    如果您想要 C# 风格 委托,请使用 std::vector&lt;std::function&lt;...&gt;&gt;:

    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::Delegateavailable here

    【讨论】:

    • 是的,我发现了这样的事情,但是在我的示例中,我如何从连接类中触发事件,并让我的主类中的处理程序接收数据?
    • 你不能在Connection 类中拥有Delegate delegate; 对象,使其成为public 并在类本身和主函数中都使用它吗?
    • 这听起来像个主意,要试试这个!
    【解决方案2】:

    这与very recent question 相关或相同。你可以在那里查看我的答案。简而言之,比构建自己的基础架构更完整/经过测试的解决方案可能是Boost.Signals2

    【讨论】:

      【解决方案3】:

      使用std::function 可能足以满足您几乎所有的用例。如果您确实需要多个事件接收器,请查看我写的multifunction (multicast delegate) proof of concept

      它允许您编写语法上类似于 C# 的代码:

      void f(int n) { cout << "f: " << n << "\n"; }
      
      util::multifunction<void(int)> event;
      
      event += f;
      event += [](int n) { cout << "[]: " << n << "\n"; };
      
      event(42);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-16
        • 1970-01-01
        • 2011-02-10
        • 2015-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多