如何在模板类型中强制静态成员初始化?或如何获取从模板类型派生的所有类的计数



考虑以下代码:

uint sNextId = 0;
uint GetNextId() { return sNextId++; }
uint GetIdCount() { return sNextId; }
class TBase<T>
{
    static const uint sId = GetNextId();
    ...
}
class DerivedA : TBase<DerivedA>
{ ... }
class DerivedB : TBase<DerivedB>
{ ... }
... More classes ...

在程序开始的某个点

void main()
{
     ... Initialization code ...
     ... here I can guarantee that no derived classes were created ...
     ... but no guarantee that all those derived classes were 'touched' here ...
     AllocateMemory();
     ... Using allocated memory, creating derived classes ...
}

我想知道有多少派生类有专门的类TBase<T>,通过调用GetIdCount()AllocateMemory()中只分配一次所需的空间。我没有任何动态库,但是我可以将静态库链接到可执行库(可以使用此TBase<T>创建更多派生类型)。

我对 c++ Jedi的问题是:

如何自动初始化sId静态成员的过程,使sNextId是正确的,并且在分配内存后不增加?请注意,我不想有显式的东西(即我不想编写额外的代码,除了添加一个继承TBase<C>的新类C)。理想情况下,该机制应该仅通过继承TBase<T>或额外继承非模板类来工作,它不应该包含任何计时器或smith、内存屏障或甚至更复杂的东西。没有考虑多线程。类可以额外继承一个非模板类型,这也可以为我们工作,但它不应该是'heavy',以及'TBase'。

谢谢!

也许你正在寻找的东西是基于漂亮柜台背后的想法。
从链接的文档来看,目的是:

确保非局部静态对象在第一次使用前初始化,并在最后一次使用后销毁。

你可以这样做,使被初始化意味着某处的计数器被递增,从而访问该计数器
当然,您仍然可以使用CRTP来做到这一点。

在手机上运行,尝试一小段代码

     class book
     {
           class empty_book: public book
           {  
                 private:
                      int pages = 0;
                 public:
                  static const empty_book& get()
                  {
                    static const empty_book p=  empty_book();
                    return p;
                   }
              };
          void foo()
          {
              int pages = empty_book::get().val();
              this = empty_book::get();
           }
      };

最新更新