我缺少的是一种强制从Base派生的类通过初始化静态成员reg来注册自己的方法.换句话说,如果派生类没有定义/初始化静态成员,是否有可能让编译器以某种方式产生错误?
struct Registrar { Registrar(string type) { registry().push_back(type); } static vector<string> & registry() { static vector<string> * derivedTypes = new vector<string>; return *derivedTypes; }};//CRTPtemplate <typename Derived>class Base{ static Registrar reg;};class Derived1 : public Base<Derived1> {/*Class deFinition*/};class Derived2 : public Base<Derived2> {/*Class deFinition*/};class Derived3 : public Base<Derived3> {/*Class deFinition*/};//...//Initialize the static members of each derived type//Commenting out any of the following 3 lines doesn't produce an error.//IDeally,I want it to produce a compile error.template<> Registrar Base<Derived1>::reg("Derived1");template<> Registrar Base<Derived2>::reg("Derived2");template<> Registrar Base<Derived3>::reg("Derived3");int main() { cout << "Registered Types:" << endl; for(vector<string>::const_iterator it = Registrar::registry().begin(); it != Registrar::registry().end(); ++it) { cout << *it << endl; } return 0;}解决方法 您至少可以通过向注册器添加虚函数来导致g中的链接器错误:voID blah(){}然后从CRTP基类中的伪构造函数调用它:
public: Base() { reg.blah(); }
我看不出更优雅的方法来解决这个问题.
总结以上是内存溢出为你收集整理的c – 强制派生类型的注册全部内容,希望文章能够帮你解决c – 强制派生类型的注册所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)