循环访问类的所有公共方法

Iterate through all public methods of a class

本文关键字:方法 访问 循环      更新时间:2023-10-16
是否可以

在使用qt5时迭代和打印我在应用程序中创建的所有函数的名称?

例如,假设我创建了自己的类(myClass),其中包含两个公共插槽

int add(int a, int b);
int mul(int a, int b);

我想要的是稍后在某个时候能够按名称打印myClass包含这两个函数。

如果你做了一些准备,你可以使用 QMetaObject 来实现这一点。使用​methodCount()您可以找到已发布方法的数量,使用method(int idx)您可以访问QMetaMethod对象。

要求是:

  1. 该类必须是 QObject 的子类
  2. 必须在类主体中使用 Q_OBJECT
  3. 该类必须通过moc
  4. 编译
  5. 不是插槽或信号的方法必须使用 Q_INVOKABLE

更新:
对于您的示例,您可以使用以下内容:

class MyClass : public QObject {
    Q_OBJECT
public slots:
   int add(int a, int b);
   int mul(int a, int b);
public:
    Q_INVOKABLE int notaslot();
};
int main(int argc, char**argv) {
    MyClass obj;
    QMetaObject *mobj = obj.metaObject();
    for (int i = 0; i < mobj->methodCount(); ++i) {
       QMetaMethod method = mobj->method(i);
       if (method.access() == QMetaMethod::Public) {
          std::cout << method.name().toStdString();
       }
    }
}

这并不容易实现,但只要付出一些努力,它可能是可行的。

您可以自定义一些现有的C++编译器来执行此操作。例如,您可以使用 MELT 自定义最近的 GCC 编译器(g++ 4.8 或 4.9 版),但这可能需要您至少花费一两个星期的工作。

您还可以在可执行文件的调试版本(或至少是非剥离版本)上运行nm -C。这将向您显示所有C++符号。

如果你只关心Qt插槽moc正在提取这些。

附言。你的问题不清楚。准确定义要显示的名称。