模板类中的'静态'模板类 - 封装,继承还是......?

时间:2012-08-04 07:17:30

标签: c++ templates static

我有一个'静态'模板类,如下所示:

#include <cstddef>

template <size_t elem_size>
struct StaticClass
{
    static void* priv;
};

因此,该类仅包含静态成员。正如静态模板所暗示的那样,每个priv都应该有一个elem_size变量。

我还有一个主模板类,它已经从另一个类继承:

template <class T>
class MainBase
{
    // types, methods...
};

template <class T>
class MainDerived : public MainBase<T>
{
    // members, methods...
};

现在,我希望MainDerived能够访问StaticClass<sizeof(T)>;这意味着相同大小的不同类型T将访问同一个变量。 这样做的最佳方法是什么?我主要考虑内存占用。

AFAICS,在StaticClass<sizeof(T)>中拥有非静态MainDerived成员会将班级大小增加1(因为'static'类的大小为1)。

所以我想到了三种方法中的任何一种:

  1. 继承StaticClass(这是多重继承),
  2. 定义StaticClass类型的静态成员
  3. 直接访问方法中的StaticClass<sizeof(T)>
  4. 所有这三种方法都会产生类似的源代码(需要以这种或那种方式明确指定类),它们都不会影响sizeof(MainDerived<T>)。我想知道是否有任何其他含义我应该知道。

1 个答案:

答案 0 :(得分:2)

我看到与标准库的字符串类有相似之处,它实际上有一个带有所有静态成员的helper类的typedef,比如

typedef std::char_traits<T>   traits_type;

然后在代码的其余部分使用traits_type::copytraits_type::assign等。

您可以使用StaticClass执行类似操作。

typedef StaticClass<sizeof(T)>   sc;

然后使用sc::priv访问每个类的正确指针。