Макрос, который создает список всех через другой макрос, созданный функциями - PullRequest
0 голосов
/ 06 июня 2018

Вот что мне нужно:

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 объекты регистрируются через другой плагин).Это означает, что мне нужно инициализировать свой список ленивым способом, как я это делаю в настоящее время.

1 Ответ

0 голосов
/ 06 июня 2018

Это можно сделать следующим образом:

fields.h:

current_macro(p1)
current_macro(p2)
current_macro(p3)

manager.h

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            
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...