C++ 在编译时指定静态和动态大小
目前,我有一个课程,形式如下:C++ 在编译时指定静态和动态大小,c++,templates,boost,architecture,software-design,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 {}; 模板 类myclass{}; 具有以下行为的特定容器: 如果N>0,则容器的静态大小为N,并且分配器模板参数应为void
template <std::size_t N,
class T,
class Allocator = typename std::conditional<N, void, std::allocator<T>>::type>
class myclass {};
模板
类myclass{};
具有以下行为的特定容器:
- 如果
,则容器的静态大小为N>0
,并且N
模板参数应为分配器
void
- 如果
,则容器的动态大小为,并且将使用N==0
参数分配器
标准,如
或boost ready
。也许boost库的设计已经遇到了这样的问题。如果是,选择了什么解决方案
考虑到我想保留一个版本的
myclass
,而不是两个版本的static\u myclass
和dynamic\u myclass
,这可能是一个很好的CRTP用例。有一个基类,它完成所有重要的工作,并向其派生类请求实际对象:
template <typename Derived, typename T>
class myclass_base_impl {
// generic stuff
// static_cast to Derived& to get actual data
};
模板
类myclass_base_impl{
//普通材料
//静态_转换为派生数据&获取实际数据
};
然后,有两个版本。动态的一个:
template <typename T>
class myclass_dynamic
: public myclass_base_impl<myclass_dynamic<T>, T>
{
/* stuff that uses std::allocator<T> */
};
模板
类myclass_动态
:public myclass\u base\u impl
{
/*使用std::分配器的东西*/
};
还有静态的:
template <typename T, size_t N>
class myclass_static
: public myclass_base_impl<myclass_static<T, N>, T>
{
// presumably something like
T data_[N];
};
模板
类myclass\u静态
:public myclass\u base\u impl
{
//大概是
T数据_un;
};
我同意这是一个优雅的实施解决方案。但我更多的是谈论用户界面。举个例子,我将有10个像myclass这样的类。显而易见的解决方案是复制接口并制作静态和动态版本。但是它变得不那么方便了,例如,如果myclass中的一些需要两种规格。@Vincent我完全不理解你的评论。用户是否可以提供分配器
,或者它只是用作内部实现?@Jarod42是的,用户可以提供分配器。删除N
并创建一个特殊的“固定分配程序”?