如何为模板 bass class 的所有实例创建共享静态变量?
How to create a shared static variable for all instantiation of template bass class?
我有一个模板基础 class,我想创建一个字段调用 id
并为从该基础继承的派生 class 的任何实例自动递增它class。这是我的第一次尝试。
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
class(结构?)并让所有 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;
}
我有一个模板基础 class,我想创建一个字段调用 id
并为从该基础继承的派生 class 的任何实例自动递增它class。这是我的第一次尝试。
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
class(结构?)并让所有 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;
}