Мне было интересно, существует ли шаблон проектирования или идиома для автоматической регистрации типа класса. Или, проще говоря, могу ли я заставить метод вызываться в классе, просто расширив базовый класс?
Например, предположим, что у меня есть базовый класс 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 Это всего лишь пример, на самом деле я не реализую животных.