【问题标题】:How do I pass a function within a namespace as a non-namespace parameter?如何将命名空间中的函数作为非命名空间参数传递?
【发布时间】: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++


【解决方案1】:

看来你要传递一个成员函数。

这个例子可能会对你有所帮助。

class A {
public:
    int i;
    int fun(int j) {
        return i + j;
    };
};
void fun(int j, A ob, int (A::* p)(int)) {
    std::cout << (ob.*p)(j);
}
void main() {
    int (A:: * fp)(int);    //declare fp as a function pointer in class A
    fp = &A::fun;          //init fp
    A obj;
    obj.i = 1;
    fun(123, obj, fp);
}

【讨论】:

    【解决方案2】:

    基于@Yksisarvinen 和@MSalters cmets,解决方案是:

    void ButtonLayer::LoadButton(std::function<void()>) {
         // do button loading stuff
         // if button is clicked...
         func();
    }
    

    然后调用它:

    LoadButton([this] { functionToCall; });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 2014-03-07
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      相关资源
      最近更新 更多