我有一个模板基类,我想创建一个字段调用id
并为从该基类继承的派生类的任何实例自动递增。这是我的第一次尝试。
namespace {
template<class T>
class BaseClass {
static uint global_id;
public:
uint m_id;
explicit BaseClass(){
m_id = global_id++;
}
};
template<class T>
uint BaseClass<T>::global_id = 0;
class IntClass: public BaseClass<int> {};
class DoubleClass: public BaseClass<double> {};
}
TEST(Exp, GlobalIdTest) {
IntClass a;
DoubleClass b;
ASSERT_EQ(a.m_id, 0);
ASSERT_EQ(b.m_id, 1);
}
但是,此代码为任何翻译单位创建单独的global_id
。是否可以为所有翻译单元使用一个静态global_id,以便上述测试通过?
答案 0 :(得分:2)
是否可以为所有翻译单元使用一个静态global_id,以便上述测试通过?
我想您可以添加一个BaseBase
类(结构?),并让所有BaseClass
从其继承。
struct BaseBase
{ static std::size_t global_id; };
template <typename T>
struct BaseClass : public BaseBase
{
std::size_t m_id;
BaseClass () : m_id{global_id++}
{ }
};
std::size_t BaseBase::global_id { 0u };
以下是完整的(简化的)示例
#include <iostream>
struct BaseBase
{ static std::size_t global_id; };
template <typename T>
struct BaseClass : public BaseBase
{
std::size_t m_id;
BaseClass () : m_id{global_id++}
{ }
};
std::size_t BaseBase::global_id { 0u };
struct IntClass : public BaseClass<int>
{ };
struct DoubleClass: public BaseClass<double>
{ };
int main ()
{
IntClass a;
DoubleClass b;
IntClass c;
std::cout << a.m_id << ' ' << b.m_id << ' ' << c.m_id << std::endl;
}