Как-то зарегистрировать мои классы в списке

Я хотел бы иметь возможность регистрировать свои классы в пределах std::map или вектора, не думайте о дубликатах и ​​т.д. но я не хочу регистрировать его в вызове конструктора класса или любой функции класса, так или иначе выполняйте его вне класса, поэтому, даже если я никогда не создам экземпляр, я мог бы знать, что он существует.

Пример:

// Somehow, from outside the myclass, in a scope that will be called
//in the begining of the proccess, add "MyClass1" to a 
//list so it can be instanciated later
class MyClass1{

}

Тогда я бы сделал #define этого или, если возможно, шаблон.
Я не знаю, понял ли я (снова)... Я хочу сказать, что мне нужно знать каждый класс, который у меня есть, без необходимости звонить каждому из них. Моя идея состояла в том, чтобы создать #define, чтобы упростить объявление заголовка класса и вызвать то, что зарегистрировало бы этот класс в списке

Можно ли это сделать или мне придется сопоставить его вручную?

// desirable:
#define CLASSREGISTER(myclass) makethemagic(##myclass); class myclass {
};

Я знаю, с этим определением я не мог использовать наследование и т.д. Я хотел бы попытаться привести пример того, что я собирался создать как-то...

Ответ 1

Вот способ размещения имен классов внутри вектора. Оставьте комментарий, если я пропустил важные детали. Я не думаю, что это будет работать для шаблонов.

struct MyClasses {
    static vector<string> myclasses;
    MyClasses(string name) { myclasses.push_back(name); }
};

#define REGISTER_CLASS(cls) static MyClasses myclass_##cls(#cls);

struct XYZ {
};

REGISTER_CLASS(XYZ);

Трюк здесь заключается в том, чтобы сделать некоторые вычисления до вызова main(), и вы можете достичь этого с помощью глобальной инициализации. REGISTER_CLASS (cls) фактически генерирует код для вызова конструктора MyClasses при запуске программы.

UPDATE: Следуя gf-предложению, вы можете написать это:

#define REGISTER_CLASS(cls) temp_##cls; static MyClasses myclass_##cls(#cls); class cls
class REGISTER_CLASS(XYZ) { int x, y, z; }

Ответ 2

Использовать boost:: mpl, vector или map.