簡體   English   中英

如何為模板低音類的所有實例創建共享的靜態變量?

[英]How to create a shared static variable for all instantiation of template bass class?

我有一個模板基類,我想創建一個字段調用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,以便上述測試通過?

有沒有辦法為所有翻譯單元使用單個靜態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;
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM