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

标签 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,这样上面的测试就会通过?

最佳答案

Is there a way to have a single static global_id for all translation units so the above test would pass?

我想你可以添加一个 BaseBase 类(struct?)并让所有 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;
 }

关于c++ - 如何为模板低音类的所有实例创建共享静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54281155/

相关文章:

c++ - clang 忽略属性 noinline

c++ - 在 C++ 中的运行时选择模板参数

php - 递归完成后,如何清除 PHP 中的静态变量?

javascript - 如何在我的网站中使用 Chrome 扩展功能 (NaCl)?

c++ - 使用 OpenCV C++ 进行楼梯检测的线拟合

c++ - 将所有值分配给结构体有什么意义吗?

c++ - 来自模板类的模板参数的 typedef 是不可见的

c# - 带有 VSIX 安装程序和 Nuget 包的 Visual Studio 2012 的多项目/解决方案模板

java - 具有空引用的静态变量

objective-c - 为什么要保留静态变量?