考虑以下代码:
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();
}
};