在编译时指定静态和动态大小
Specifying static and dynamic sizes at compile time
目前,我有一个 class,格式如下:
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 的一个很好的用例。有一个基础 class 来完成所有重要的事情,它要求它的派生 class 获取实际对象:
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];
};
目前,我有一个 class,格式如下:
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 的一个很好的用例。有一个基础 class 来完成所有重要的事情,它要求它的派生 class 获取实际对象:
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];
};