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

时间:2015-06-12 14:58:10

标签: 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 {};

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

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

但我对这种设计并不满意,因为它看起来并不优雅。我想要一个解决方案standard-likeboost-ready。也许已经遇到过一个升级库的设计问题。如果是这样,选择了哪种解决方案?

考虑到我希望保留myclass的单个版本,而不是两个版本static_myclassdynamic_myclass

1 个答案:

答案 0 :(得分:2)

这可能是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];
};