gpt4 book ai didi

c++ - 这是实现自定义事件处理程序的正确方法吗?

转载 作者:行者123 更新时间:2023-11-30 03:06:04 24 4
gpt4 key购买 nike

我一直在寻找一种将自定义事件处理程序添加为 C++ 类成员函数的方法。发现这段代码确实有效。我需要将库类和用户代码分开,允许用户代码自定义库类。这是代码的概念。这样做是否正确?线程安全超出了我的问题范围。编译器是 gcc。用户代码非常非常整洁。没有使用继承、虚函数、模板

#include <stdio.h>

typedef void fn();

class aaa
{
public:
aaa() : customhandler(NULL) {}
fn *customhandler;
};

//用户代码开始

void dostuff() {
printf("doing stuff 1\n");
}
void dostuff2() {
printf("doing stuff 2\n");
}
int main()
{
aaa aaa1;
aaa1.customhandler = &dostuff;
aaa1.customhandler();
aaa1.customhandler = &dostuff2;
aaa1.customhandler();
}

最佳答案

好吧,如果你有一个 Boost 库或支持 C++0x 的编译器,你可能会有这样的代码:

#include <cstdio>
#include <functional>

struct Foo
{
std::function<void ()> handler;

void invoke ()
{
if (handler)
{
handler ();
}
else
{
printf ("Oops, handler is not there!\n");
}
}
};

static void myHandler1 (int arg)
{
printf ("Handler #1 (arg=%d)\n", arg);
}

static void myHandler2 ()
{
printf ("Handler #2\n");
}

int main ()
{
Foo f;

f.invoke ();

f.handler = std::bind (&myHandler1, 13);
f.invoke ();

f.handler = &myHandler2;
f.invoke ();
}

它的好处是您可以使用可选的附加参数将函数或仿函数绑定(bind)到处理程序。

您的原始代码也可以工作,但是如果我想调用类的方法而不是普通函数怎么办?如果我还想传递一些在调用处理程序时可以在处理程序内部访问的状态怎么办?这就是 std::function 将其纳入 C++ 标准的众多原因之一。

关于c++ - 这是实现自定义事件处理程序的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7045456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com