Мне было интересно, существует ли шаблон дизайна или идиома для автоматического регистрации типа класса. Или проще, могу ли я заставить метод получать вызов класса, просто расширяя базовый класс?
Например, скажем, у меня есть базовый класс Animal
и расширение классов Tiger
и Dog
, и у меня есть вспомогательная функция, которая выводит все классы, расширяющие Animal
.
Итак, я мог бы что-то вроде:
struct AnimalManager
{
static std::vector<std::string> names;
static void registerAnimal(std::string name) {
//if not already registered
names.push_back(name); }
};
struct Animal
{
virtual std::string name() = 0;
void registerAnimal() { AnimalManager::registerAnimal(name()); }
};
struct Tiger : Animal
{
virtual std::string name() { return "Tiger"; }
};
Итак, в основном я бы сделал:
Tiger t;
t.registerAnimal();
Это может быть сработано и в функции static
. Есть ли какой-либо шаблон (например, любопытно рекурсивный шаблон) или что-то подобное, что может помочь мне в этом, без явного вызова метода registerAnimal
.
Я хочу, чтобы мой class Animal
расширялся в будущем, а другие могли забыть позвонить register
, я ищу способы предотвратить это , кроме того, документируя этот (который я так или иначе).
PS Это просто пример, я на самом деле не реализую животных.