[英]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.