Каким-то образом зарегистрировать мои занятия в списке
Я хотел бы иметь возможность зарегистрировать свои классы в 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 {
};
Я знаю, с этим определением я не мог использовать наследование и т. Д.... Я хотел попытаться привести пример того, что я хотел как-то создать...
2 ответа
Вот метод, чтобы поместить имена классов внутри вектора. Оставьте комментарий, если я пропустил важные детали. Я не думаю, что это будет работать для шаблонов, хотя.
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 при запуске программы.
ОБНОВЛЕНИЕ: Следуя предложению GF, вы можете написать это:
#define REGISTER_CLASS(cls) temp_##cls; static MyClasses myclass_##cls(#cls); class cls
class REGISTER_CLASS(XYZ) { int x, y, z; }