c++ - 模板类中的“静态”模板类——封装、继承还是……?

标签 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(因为“静态”类的大小为 1)。

所以我正在考虑以下三种方法之一:

  1. 继承自 StaticClass (那就是多重继承),
  2. 定义 StaticClass 的静态成员类型,
  3. 正在访问 StaticClass<sizeof(T)>直接在方法中。

所有这三种方法都会产生相似的源代码(需要以某种方式显式指定类),并且它们都不会影响 sizeof(MainDerived<T>) .我想知道其中是否有任何我应该注意的额外含义。

最佳答案

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

typedef std::char_traits<T>   traits_type;

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

您可以对 StaticClass 执行类似的操作。

typedef StaticClass<sizeof(T)>   sc;

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

关于c++ - 模板类中的“静态”模板类——封装、继承还是……?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11806729/

相关文章:

c++ - 这个 for 循环是如何终止的?

具有常量和变量变化的 C++ 模板

c++ - 未找到模板重载

c++ - C++ 中的静态成员 Qt 对象

c++ - 每个#include 指令预处理器的时间成本是多少?

c++ - 从 32 位进程挂接 64 位进程时,SetWindowsHookEx() 不会返回错误?

c++ - 没有用于初始化 'string'(又名 'basic_string<char>')的匹配构造函数

c++ - 从成员函数指针类型生成仿函数

c++ - Visual C++ Express 2008 的静态运行时库链接

java - 为什么 x 被视为对象(即使它引用数组)也是一个错误?