Вот что мне нужно:
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;
}
}
Мой макрос выглядит следующим образом:
#define DEFINE_PARAM_CPP(NAME) \
private: \
IParam * NAME; \
public: \
IParam * get##NAME() \
{ \
if (NAME == NULL) \
{ \
NAME = new IParam("NAME"); \
allParams.push_back(NAME); \
} \
return NAME; \
}
Вопрос
Как вы можетевидите, мне нужно инициализировать вектор (allParams
).Макрос еще не решает эту проблему (функция init
не создается макросом), есть идеи, как мне создать функцию init?Определение статического списка и добавление элементов в этот список в самом макросе не является решением (проверьте фоновую информацию, чтобы выяснить, почему).Мне нужен макрос, который создает список всех функций, которые были созданы с помощью макроса DEFINE_PARAM_CPP
...
Фон
Мой класс реализует интерфейси он будет зарегистрирован в API плагина другого программного обеспечения.Это означает, что я не могу создавать экземпляры IParam
, пока все плагины не зарегистрированы, а API позволяет мне создавать IParam
объекты (IParam
объекты регистрируются через другой плагин).Это означает, что мне нужно инициализировать свой список ленивым способом, как я это делаю в настоящее время.