c – 强制派生类型的注册

c – 强制派生类型的注册,第1张

概述我有一个注册器的实现,用于从某个基类派生的类.目的是让每个派生类自身注册并在此过程中提供一些关于自身的信息,在下面的示例中通过字符串提供. 我缺少的是一种强制从Base派生的类通过初始化静态成员reg来注册自己的方法.换句话说,如果派生类没有定义/初始化静态成员,是否有可能让编译器以某种方式产生错误? struct Registrar { Registrar(string type) { 我有一个注册器的实现,用于从某个基类派生的类.目的是让每个派生类自身注册并在此过程中提供一些关于自身的信息,在下面的示例中通过字符串提供.

我缺少的是一种强制从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 – 强制派生类型的注册所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1226450.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存