【问题标题】:'Static' template class in a template class — encapsulation, inheritance or …?模板类中的“静态”模板类——封装、继承还是……?
【发布时间】:2012-08-02 03:38:46
【问题描述】:

我有一个类似于以下的“静态”模板类:

#include <cstddef>

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

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

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

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

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

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

AFAICS,在MainDerived 中有一个非静态的StaticClass&lt;sizeof(T)&gt; 成员会使类大小增加 1(对于“静态”类的大小为 1)。

所以我正在考虑三种方法中的一种:

  1. StaticClass 继承(然后是多重继承),
  2. 定义StaticClass类型的静态成员,
  3. 直接在方法中访问StaticClass&lt;sizeof(T)&gt;

所有三种方法都将产生相似的源代码(需要以一种或另一种方式明确指定类),并且它们都不会影响sizeof(MainDerived&lt;T&gt;)。我想知道其中是否有我应该注意的其他含义。

【问题讨论】:

  • I would like the members to be specific to a particular StaticClass&lt;elem_size&gt; -> 什么意思?
  • 如果MainDerived的两个实例使用不同的模板参数T,但两个T类型的大小相同怎么办?那么静态类将是相同的,即使T 不同。
  • @Mr.Anubis, @JoachimPileborg:我编辑了这篇文章以澄清一点。简而言之,这意味着每个elem_size 都有一个变量;对于大小相同的不同T,变量应该是共享的。

标签: c++ templates static


【解决方案1】:

我发现它与标准库的字符串类有相似之处,它(实际上)有一个用于所有静态成员的辅助类的 typedef,例如

typedef std::char_traits<T>   traits_type;

然后在其余代码中使用traits_type::copytraits_type::assign 等。

你可以用你的StaticClass做类似的事情。

typedef StaticClass<sizeof(T)>   sc;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2011-03-22
    相关资源
    最近更新 更多