2

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

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

4

3 回答 3

8

用作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课程,可在此处获得

于 2013-10-15T13:43:27.610 回答
0

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

于 2013-10-15T13:52:11.653 回答
0

对于几乎所有用例,使用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);
于 2013-10-15T13:56:58.000 回答