gpt4 book ai didi

c++ - 将 freeglut 回调包装在一个类中的最优雅的方式

转载 作者:太空狗 更新时间:2023-10-29 21:44:47 28 4
gpt4 key购买 nike

我编写了一个 event 类模板,旨在提供 C# 风格的事件:事件实例存储为类的公共(public)成员,以向所有者类提供不同的事件。例如:

template<typename SENDER , typename ARGS>
class event{ .... };

struct foo
{
event<foo,int> event_a;
...

void do_work()
{
int data;

....

event_a.raise_event( *this , a );
}
};

void on_event_a(foo& , int&) { std::cout << "On event_a of class foo!" << std::endl; }

struct bar
{
void on_event_a(int&) { std::cout << "Catching an event with a member function!"; }
};


int main()
{
int argumment;

foo foo_instance;
bar bar_instance;

foo.event_a.add_handler( [](foo& , int& ) { std::cout << "Lambda!" << std::endl; } );
foo.event_a.add_handler( on_event_a );
foo.event_a.add_handler( bar_instance , &bar::on_event_a );

foo_instance.do_work();
}

输出是:

Lambda!
On event_a of class foo!
Catching an event with a member function!

现在我想使用该机制以 OO 风格包装 freeglut。具体来说,我不想编写一个类来负责管理不同的 freeglut 事件(窗口大小调整、键盘输入、鼠标移动等)。
我的第一个想法是使用类构造函数为每个 freeglut 回调注册一个 lambda,lambda 绕过回调的参数到适当的事件,如下所示:

class freeglut_events
{
event<freeglut_events> repaint_event;

freeglut_events()
{
glutDisplayFunc( [&](){ repaint_event.raise_event( *this ); } );
}
};

但这会导致以下编译器错误(我使用的是 Visual Studio 2012):

There is no valid conversion from '[]lambda() -> void' to 'void(*)()'

我的理解是注册函数期望的全局函数指针的签名和lambda的签名并不完全相等,因为lambda捕获的是本地数据。

我的问题是:还有其他优雅的方法可以实现这一点吗?

最佳答案

嗯,你不能那样做。由于只有非捕获 lambda 可以转换为函数指针,并且 glutDisplayFunc接受一个函数指针参数,即 void (*func)(void)

另请参阅此答案:Passing 1 argument (pointer) to glutDisplayFunc?

关于c++ - 将 freeglut 回调包装在一个类中的最优雅的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19339374/

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