Каким-то образом зарегистрировать мои занятия в списке

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

Используйте boost::mpl, vector или map.

Другие вопросы по тегам