【发布时间】:2020-04-07 08:09:42
【问题描述】:
按下按钮时我需要调用一个函数。下面的函数应该接受要调用的函数:
void ButtonLayer::LoadButton(void(*func)()) {
// do button loading stuff
// if button is clicked...
func();
}
除了在单独的命名空间中传递函数会产生以下错误之外,这将起作用:
argument of type "void(OtherLayer::*)()" is incompatiable with parameter of type "void(*)()"
我不想让我传递的每个函数都是静态的以避免这个问题,所以我需要一些方法来将命名空间中的函数转换为 void(*) 类型。我已经尝试过静态转换,但我不确定确切的语法,因为我是 C++ 的新手
【问题讨论】:
-
OtherLayer是一个类吗?成员函数不能转换为函数指针。 -
OtherLayer 是一个类,但在我的实际代码中,我将它放在 System:: 命名空间中,所以它可能是 System::OtherLayer::* 并且问题仍然存在
-
命名空间无关紧要。您不能将非静态类成员函数用作函数指针,因为它们属于不同类型。如果您可以将
LoadButton更改为采用std::function参数,则可以在那里传递成员函数,或者您必须以某种方式解决它。 -
我会研究 std::function,谢谢
-
如果您不想或可以更改
LoadButton的接口,您可能需要传递一个捕获OtherLayer对象的lambda。
标签: c++