Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ';静态';模板类中的模板类—;封装、继承还是…;?_C++_Templates_Static - Fatal编程技术网

C++ ';静态';模板类中的模板类—;封装、继承还是…;?

C++ ';静态';模板类中的模板类—;封装、继承还是…;?,c++,templates,static,C++,Templates,Static,我有一个类似于以下内容的“静态”模板类: #include <cstddef> template <size_t elem_size> struct StaticClass { static void* priv; }; 现在,我希望main派生的能够访问StaticClass;这意味着相同大小的不同类型T将访问相同的变量这样做的最佳方法是什么?我主要考虑的是内存占用 AFAICS在main派生的中有一个非静态的StaticClass成员,会将类大小增加1(因

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

#include <cstddef>

template <size_t elem_size>
struct StaticClass
{
    static void* priv;
};
现在,我希望
main派生的
能够访问
StaticClass
;这意味着相同大小的不同类型
T
将访问相同的变量这样做的最佳方法是什么?我主要考虑的是内存占用

AFAICS在
main派生的
中有一个非静态的
StaticClass
成员,会将类大小增加1(因为“静态”类的大小为1)

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

  • 继承自
    StaticClass
    (这是一个多重继承)
  • 定义
    StaticClass
    类型的静态成员
  • 直接访问方法中的
    StaticClass

  • 这三种方法都将产生类似的源代码(需要以某种方式明确指定类),并且它们都不会影响
    sizeof(main派生)
    。我想知道其中是否有我应该注意的其他含义。

    我看到了与标准库的string类的相似之处,它(实际上)为包含所有静态成员的helper类提供了typedef,如

    typedef std::char_traits<T>   traits_type;
    

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

    我希望成员特定于特定的StaticClass
    ->这意味着什么?如果两个
    main的实例使用不同的模板参数
    T
    ,但两个
    T
    类型的大小相同,会怎么样?那么,静态类将是相同的,即使
    T
    不同。@Mr.Anubis,@JoachimPileborg:我编辑了这篇文章来澄清这一点。简而言之,这意味着每个元素大小都有一个变量;对于大小相同的不同
    T
    ,应共享变量。
    typedef std::char_traits<T>   traits_type;
    
    typedef StaticClass<sizeof(T)>   sc;