C++ 通过另一个宏创建的函数创建所有宏的列表的宏

C++ 通过另一个宏创建的函数创建所有宏的列表的宏,c++,macros,C++,Macros,以下是我需要的: class Manager { private: IParam *p1; IParam *p2; IParam *p3; std::vector<IParam*> allParams; public: void init() { // init allParams list, simply calling all gette

以下是我需要的:

class Manager
{
    private:
        IParam *p1;
        IParam *p2;
        IParam *p3;

        std::vector<IParam*> allParams;

    public:

        void init() 
        {
            // init allParams list, simply calling all getter is enough here
            getP1();
            getP2();
            getP3();
        }

        IParam *getP1()
        {
            if (p1 == NULL)
            {
                p1 = new IParam("p1");
                allParams.push_back(p1);
            }
            return p1;
        }

        IParam *getP2()
        {
            if (p2 == NULL)
            {
                p2 = new IParam("p2");
                allParams.push_back(p2);
            }
            return p2;
        }

        IParam *getP3()
        {
            if (p3 == NULL)
            {
                p3 = new IParam("p3");
                allParams.push_back(p3);
            }
            return p3;
        }
}
问题


如您所见,我需要初始化一个向量(
allParams
)。宏还没有解决这个问题(宏没有创建
init
函数),你知道如何创建init函数吗?定义静态列表并在宏本身中将项目添加到此列表中不是解决方案(请查看背景信息以了解原因)。我需要一个宏,该宏创建了使用
DEFINE\u PARAM\u CPP
宏创建的所有函数的列表

背景


我的类正在实现一个接口,它将在另一个软件的插件API中注册。这意味着,在注册所有插件之前,我无法创建
ipram
的实例,API允许我创建
ipram
对象(
ipram
对象通过另一个插件注册)。这意味着,我需要像目前一样以惰性方式初始化列表。

可以通过以下方式完成:

字段。h:

current_macro(p1)
current_macro(p2)
current_macro(p3)
经理

class Manager{
  private:
    #define current_macro //how you want define elements
    #include fields.h
    #undef current_macro
    std::vector<IParam*> allParams;
  public:
    #define current_macro //how you want your getter to look like
    #include fields.h
    #undef current_macro
    void init() 
    {
      #define current_macro //how you want your part of init look like
      #include fields.h
      #undef current_macro            
    }
}
类管理器{
私人:
#定义当前_宏//如何定义元素
#包括字段
#未定义当前_宏
std::向量所有参数;
公众:
#定义当前_宏//希望getter的外观
#包括字段
#未定义当前_宏
void init()
{
#定义当前_宏//您希望init部分的外观
#包括字段
#未定义当前_宏
}
}

“有什么想法可以创建init函数吗?”自己键入代码来编写?根据我的经验,仅使用宏来保存键入内容总是以可怕的方式结束,这样很容易忘记它。我不想做一件事(添加参数),总是要在两个地方添加它。。。我目前确实将定义复制到notepad++,应用正则表达式并将结果复制回init函数。我希望避免此手动步骤,并避免忘记在列表中注册参数的危险为什么需要
getP1()
getP2()
等?为什么不只有一个函数
IParam*getP(inti)
?您根本不需要宏。@user463035818将此告诉google自动测试组;如果它在各种IDE中没有得到很好的支持,我会自己编写一个不那么滥用宏的IDE@如果是针对有限范围的宏,则可以使用UKMonkey imho。我刚刚基于宏编写了自己的玩具测试框架。对于测试,我可以使用神秘的东西,只要它不会泄漏到我的实际代码OMG中,我已经在多个地方这样做了,没有看到重用列表的解决方案。。。
class Manager{
  private:
    #define current_macro //how you want define elements
    #include fields.h
    #undef current_macro
    std::vector<IParam*> allParams;
  public:
    #define current_macro //how you want your getter to look like
    #include fields.h
    #undef current_macro
    void init() 
    {
      #define current_macro //how you want your part of init look like
      #include fields.h
      #undef current_macro            
    }
}