如何为模板低音类的所有实例创建共享的静态变量?

时间:2019-01-20 21:28:50

标签: c++ templates static-variables

我有一个模板基类,我想创建一个字段调用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,以便上述测试通过?

1 个答案:

答案 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;
 }