目前,我有一个如下形式的类:
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/