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
}
}