Псевдоним для предыдущего макрокоманды - PullRequest
0 голосов
/ 09 апреля 2020

Справочная информация:

Я пытаюсь создать реестр объектов, но каждый объект имеет определенное значение, например, параметр int.

template<int Parameter>
class SomeObject
{
// things
}

Я создал макрос для регистрации их

#define REGERISTER_OBJECT(PREFIX,OBJECT)\
class reg_##PREFIX\
{\
 template<int Parameter>\
using Name = OBJECT\
template<int Parameter>\
void Register()\
{\
ObjectRegistry<Parameter>::Register<Name>();\
}

, где ObjectRegistry<Pameter> - это просто шаблонная версия https://www.bfilipek.com/2018/02/factory-selfregister.html

Теперь дело в том, что я хочу создать реестр только для конкретных c параметры. (Обратите внимание, мы можем предположить, что Параметр будет принимать только одно значение (например, 1,2,3). Однако в любом проекте мне понадобится только одно из них.)

Каждое раз я пытаюсь сделать эту работу. Я сталкиваюсь с одной из трех проблем:

  1. Ничего не создается, а реестр пуст.
  2. Все создается, и для компиляции требуется абсурдное требование к памяти.
  3. I требуется функция виртуального шаблона (если вы пытаетесь получить reg _ ## PREFIX из некоторого базового класса) и ничего не компилируется.

Вопрос:

Лучший способ сделать эту работу - если бы был способ написать макрос наподобие этого:

#define REGERISTER_OBJECT(PREFIX,OBJECT)\
class reg_##PREFIX\
{\
using Previos = CLASS_CREATED_LAST_TIME_THIS_MACRO_WAS_INVOKED;
 template<int Parameter>\
using Name = OBJECT\
}

Я мог бы создать рекурсивную функцию, чтобы потом все регистрировать. (Я верю.) Однако, похоже, нет способа хранить данные из последнего вызова (т.е. в #define). Есть ли способ обойти это?

...