Как я могу разместить typedef внутри класса с помощью макросов?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как я могу разместить typedef внутри класса с помощью макросов?

Сообщение Anonymous »

У меня есть реестр компонентов, в котором регистрируются компоненты (классы/типы). Мне удалось сделать так, что система не будет работать, если вы попытаетесь использовать ее с незарегистрированным классом. Однако даже если он был зарегистрирован один раз в одном типе реестра, он работает со всеми из них, потому что есть:

Код: Выделить всё

template  static inline component_id;
Он помещается внутри класса макросом.

Код: Выделить всё

template 
struct ComponentRegistry
{
using this_type = ComponentRegistry;

template 
static char register_new_component(const char* name)
{
static int counter = 0;
component_t::template component_id = counter++;
/* REGISTER THE COMPONENT HERE*/

return char(); /* ANYTHING. THE ONLY ONLY REASON THE DUMMY EXISTS IS TO TRIGGER THIS FUNCTION CALL ON PROGRAM INITIALIZATION */
}
template 
int getComponentID()
{
/* IF THE COMPONENT WASN'T REGISTERED WITH ANY REGISTRY AT ALL, THEN THE template component_id DOESN'T EXIST AND SO IT WORKS
- THE PROBLEM IS THAT EVEN IF IT WAS REGISTERED WITH ANOTHER REGISTRY THIS WILL STILL INSTANTIATE THE TEMPLATE
- HOW DO I THROW A COMPILE ERROR? */
return component_t::template component_id;
}
};

#define REGISTER_COMPONENT_WITH_REGISTRY(comp_name, ecs_registry_type, comp_type) \
static inline char dummy_assignee_##ecs_registry_type = ecs_registry_type::register_new_component(comp_name); \
template  \
static inline int component_id;

struct ComponentRegistryName {}; // JUST USED TO DISTINGUISH. EACH TYPE CAN HAVE ITS OWN SET OF COMPONENTS

using ComponentRegistryType = ComponentRegistry;

struct MyComponentType
{
REGISTER_COMPONENT_WITH_REGISTRY("MyComponentTypeName", ComponentRegistryType, MyComponentType)

};

struct MyComponentType2
{
/* NOT REGISTERED */
};

int main()
{
ComponentRegistryType component_registry;

component_registry.getComponentID(); // THIS SUCCEEDS BECAUSE IT WAS REGISTERED
//component_registry.getComponentID(); // THIS FAILS TO COMPILE BECAUSE THE COMPONENT WASN'T REGISTERED

}
Это хорошо подходит для проверки того, был ли компонент вообще зарегистрирован, а если нет:
Но проблема в том, хочу ли я зарегистрировать компонент в другой тип реестра, проверка ограничений больше не выполняется, потому что когда я это делаю:
comComponent_t::template компонент_id
Не существует вообще. Однако даже если getComponentID вызывается с аргументом шаблона компонента, который был зарегистрирован в ЛЮБОМ реестре, это завершается успешно. Я надеялся поместить определение типа в класс с помощью макроса, который я могу проверить как член, и если он существует, то это хорошо.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ing-macros
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»