Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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_Boost_Architecture_Software Design - Fatal编程技术网

C++ 在编译时指定静态和动态大小

C++ 在编译时指定静态和动态大小,c++,templates,boost,architecture,software-design,C++,Templates,Boost,Architecture,Software Design,目前,我有一个课程,形式如下: template <std::size_t N, class T, class Allocator = typename std::conditional<N, void, std::allocator<T>>::type> class myclass {}; 模板 类myclass{}; 具有以下行为的特定容器: 如果N>0,则容器的静态大小为N,并且分配器模板参数应为void

目前,我有一个课程,形式如下:

template <std::size_t N, 
          class T,
          class Allocator = typename std::conditional<N, void, std::allocator<T>>::type>
class myclass {};
模板
类myclass{};
具有以下行为的特定容器:

  • 如果
    N>0
    ,则容器的静态大小为
    N
    ,并且
    分配器
    模板参数应为
    void
  • 如果
    N==0
    ,则容器的动态大小为,并且将使用
    分配器
    参数
但是我不满意这个设计,因为它看起来不优雅。我想要一个解决方案
标准,如
boost ready
。也许boost库的设计已经遇到了这样的问题。如果是,选择了什么解决方案


考虑到我想保留一个版本的
myclass
,而不是两个版本的
static\u myclass
dynamic\u myclass
,这可能是一个很好的CRTP用例。有一个基类,它完成所有重要的工作,并向其派生类请求实际对象:

template <typename Derived, typename T>
class myclass_base_impl { 
    // generic stuff
    // static_cast to Derived& to get actual data
};
模板
类myclass_base_impl{
//普通材料
//静态_转换为派生数据&获取实际数据
};
然后,有两个版本。动态的一个:

template <typename T>
class myclass_dynamic 
: public myclass_base_impl<myclass_dynamic<T>, T>
{
    /* stuff that uses std::allocator<T> */
};
模板
类myclass_动态
:public myclass\u base\u impl
{
/*使用std::分配器的东西*/
};
还有静态的:

template <typename T, size_t N>
class myclass_static
: public myclass_base_impl<myclass_static<T, N>, T>
{
     // presumably something like
    T data_[N];
};
模板
类myclass\u静态
:public myclass\u base\u impl
{
//大概是
T数据_un;
};

我同意这是一个优雅的实施解决方案。但我更多的是谈论用户界面。举个例子,我将有10个像myclass这样的类。显而易见的解决方案是复制接口并制作静态和动态版本。但是它变得不那么方便了,例如,如果myclass中的一些需要两种规格。@Vincent我完全不理解你的评论。用户是否可以提供
分配器
,或者它只是用作内部实现?@Jarod42是的,用户可以提供分配器。删除
N
并创建一个特殊的“固定分配程序”?