Как автоматически зарегистрировать класс при создании

Мне было интересно, существует ли шаблон проектирования или идиома для автоматической регистрации типа класса. Или, проще говоря, могу ли я заставить метод вызываться в классе, просто расширив базовый класс?

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

15
задан AMCoder 26 April 2012 в 11:59
поделиться