我找到了这篇文章: https://tristanbrindle.com/posts/beware-copies-initializer-list 我对所提供的部分代码有疑问:
第一页:
我认为这与从属名称有关,但是我不确定这部分的目的是什么
template <typename T>
typename instance_counter<T>::counter instance_counter<T>::icounter{};
第二个:
template <typename T>
struct counted : T, private instance_counter<T>
{
using T::T;
};
有人可以给我解释这些代码吗?
答案 0 :(得分:3)
有人可以给我解释这些代码吗?
template <typename T>
typename instance_counter<T>::counter instance_counter<T>::icounter{};
这是instance_counter
模板中声明的静态变量的初始化(请参阅博客文章中的static struct counter { /* ... */ } icounter;
)。有关静态数据成员的初始化的更多信息,请参见this thread。该定义引用模板的嵌套名称(counter
),并且编译器默认将其视为值的名称,而不是类型。要更改此默认解释,您需要在typename
之前加上前缀。有关详细信息,请参见this thread。
template <typename T>
struct counted : T, private instance_counter<T>
{
using T::T;
};
在这里,模板counted
从T
公开继承(public
的继承是struct
的默认继承),私有地从instance_counter<T>
继承。公共继承部分与using T::T
(带来T
的所有ctor重载)一起用于提供与实例化模板的类相同的接口(例如,帖子中的string
)。私有继承部分表示是在术语中实现的,并确保为新实例化的类类型引入instance_counter
机制,并在析构函数中生成输出。