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

Specifying static and dynamic sizes at compile time

目前,我有一个 class,格式如下:

template <std::size_t N, 
          class T,
          class Allocator = typename std::conditional<N, void, std::allocator<T>>::type>
class myclass {};

这是具有以下行为的特定容器:

但是我对这个设计并不满意,因为它看起来不够优雅。我想要一个解决方案 standard-likeboost-ready。可能其中一个boost库的设计已经遇到过这样的问题。如果是,选择了什么解决方案?

考虑到我想保留 myclass 的一个版本,而不是 static_myclassdynamic_myclass 的两个版本。

这可能是 CRTP 的一个很好的用例。有一个基础 class 来完成所有重要的事情,它要求它的派生 class 获取实际对象:

template <typename Derived, typename T>
class myclass_base_impl { 
    // generic stuff
    // static_cast to Derived& to get actual data
};

然后,你有两个版本。动态的:

template <typename T>
class myclass_dynamic 
: public myclass_base_impl<myclass_dynamic<T>, T>
{
    /* stuff that uses std::allocator<T> */
};

静态的:

template <typename T, size_t N>
class myclass_static
: public myclass_base_impl<myclass_static<T, N>, T>
{
     // presumably something like
    T data_[N];
};