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

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


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


如果为N > 0,则容器的静态大小为N,并且Allocator模板参数应为void
如果为N == 0,则容器的动态大小为,将使用Allocator参数。


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

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

最佳答案

这对于CRTP可能是一个很好的用例。有一个执行所有重要工作的基类,它向派生类询问实际的对象:

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];
};

关于c++ - 在编译时指定静态和动态大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30806209/

10-09 21:57