目前,我有一堂课,形式如下:
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
。可能在boost库之一的设计中已经遇到了这样的问题。如果是这样,选择了什么解决方案?考虑到我要保留一个版本的
myclass
,而不是两个版本的static_myclass
和dynamic_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/