Da *_*aex 1 c# c++ unix events delegates
我想在标准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;
}
}
Run Code Online (Sandbox Code Playgroud)
我用指尖搜索了血腥的东西,但发现的只是事件触发,而不是像我的示例中那样覆盖类。
实际上,我是Standard C ++的新手,也许有一种简单的方法可以通过在类中触发数据来将数据添加到覆盖类,而我只是还没有看到它。
但是,是的,正如我所说,我一无所知,我们将不胜感激。
使用std::function作为回调:
void printSomething() { std::cout << "event!" << std::endl; }
int main() {
std::function<void()> onEvent;
onEvent = &printSomething;
onEvent(); // prints "event!"
}
Run Code Online (Sandbox Code Playgroud)
如果要使用C#样式的委托,请使用std::vector<std::function<...>>:
struct Delegate {
std::vector<std::function<void()>> funcs;
template<class T> Delegate& operator+=(T mFunc) { funcs.push_back(mFunc); }
void operator()() { for(auto& f : funcs) f(); }
};
int main() {
Delegate delegate;
delegate += []{ std::cout << "hello, "; };
delegate += []{ std::cout << "world!" << endl; };
delegate(); // prints "hello, world!"
}
Run Code Online (Sandbox Code Playgroud)
或只复制我的ssvu::Delegate课程,可在此处获得。
| 归档时间: |
|
| 查看次数: |
2435 次 |
| 最近记录: |