По запросу ОП я опубликую решение, которое я предложил в комментариях.
Я совершенно уверен, что в новом стандарте C ++ есть лучший шаблон с шаблонами, но в любом случае я опубликую решение препроцессора, которое уродливо и не должно использоваться!
#define FUNCTION_DECLARATION(RETURNTYPE, FUNCTIONNAME, ...) \
RETURNTYPE FUNCTIONNAME(__VA_ARGS__)
Это будет использоваться в объявлении класса как:
class Level {
FUNCTION_DECLARATION(uint32_t, CreateEntity);
FUNCTION_DECLARATION(Entity&, GetEntity, uint32_t);
};
Определение будет выглядеть так:
#define FUNCTION_DEFINITION(RETURNTYPE, PROPERTY, FUNCTIONNAME, ...) \
RETURNTYPE Level::FUNCTIONNAME(__VA_ARGS__) \
{ \
return PROPERTY.FUNCTIONNAME(__VA_ARGS__); \
} \
А теперь очень уродливое использование, чтобы сделать эту работу:
FUNCTION_DEFINITION(Entity&, entityManager, GetEntity, uint32_t(entityId))
Я не могу гарантировать, что это будет работать для любого типа, также я не тестировал большую часть кода. Как вы можете видеть, этот «взлом» с помощью ввода будет работать только для простых типов, а не для ссылок или указателей. На классах это вызовет конструктор копирования!
Конечно, это можно улучшить, заменив VA_ARGS переменной для типа и именем переменной для каждого аргумента функции, но, опять же, это очень утомительно, и для каждого числа аргументов нужно написать шаблон, который должен быть используемый. В результате вы получите почти столько же кода, сколько раньше.
Итак, позвольте мне еще раз заявить: придерживайтесь шаблонов, они намного лучше, чем это!
Просто я не знаю, как с ними это сделать. Поэтому, пожалуйста, если есть кто-нибудь, кто знает, как сделать это с помощью шаблонов, вместо того, чтобы избивать меня этим ** кодом, напишите прекрасное решение, которого все здесь ждут.