目前,我有一个以下形式的课程:
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-like
或boost-ready
。也许已经遇到过一个升级库的设计问题。如果是这样,选择了哪种解决方案?
考虑到我希望保留myclass
的单个版本,而不是两个版本static_myclass
和dynamic_myclass
。
答案 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];
};