Как-то зарегистрировать мои классы в списке
Я хотел бы иметь возможность регистрировать свои классы в пределах 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.