Jon*_*han 6 c++ class c-preprocessor
我希望能够在一个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{
}
Run Code Online (Sandbox Code Playgroud)
然后我会做一个#define或如果能够,模板.
我不知道我是否清楚(再次)......我的观点是,我需要知道我所拥有的每一堂课,而不必打电话给他们每一个人.
我的想法是创建一个#define更容易声明类的标头并调用将该特定类注册到列表的东西
可以这样做还是我必须手动映射?
// desirable:
#define CLASSREGISTER(myclass) makethemagic(##myclass); class myclass {
};
Run Code Online (Sandbox Code Playgroud)
我知道,在那个定义中我不能使用继承等...我的观点是试图给出一个我想要以某种方式创建的例子......
这是将类名放在向量中的方法.如果我错过了重要细节,请发表评论.不过,我认为它不适用于模板.
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);
Run Code Online (Sandbox Code Playgroud)
这里的技巧是在调用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; }
Run Code Online (Sandbox Code Playgroud)