Код: Выделить всё
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
Мобильная версия