我想实现一个字符串类,它具有在堆栈或堆上创建内部缓冲区的选项。所以我想起那个字符串的外观,如:
String str_on_heap;
String<512> str_on_stack;
会很优雅。但是,后者我发现在C ++中很难实现这样的接口。
template < int StackBufferSize = 0 >
class String {
... // Codes to implement String on stack.
};
template <>
class String< 0 > {
... // Codes to implement String on heap.
};
String str_on_heap; // Compile error, should be "String<> str_on_heap;"
String<512> str_on_stack; // OK.
有没有人有想法或其他C ++技巧来提供这样的界面? 谢谢!
答案 0 :(得分:2)
如果String
类是模板,则在引用该类时始终需要使用<>
表示法。
你可以做的是为使用堆的StackBufferSize == 0
写一个模板专门化。
template <int StackBufferSize = 0>
class String
{
// code to allocate string on the stack
};
template <>
class String<0>
{
// code to allocate on the heap
};
这样,当你声明String<>
时,它将使用堆的特化。
那就是说,这可能不是一个好的设计决定。一个更好的解决方案可能是使用std::basic_string
并提供自定义分配器,如果你真的需要避免堆分配。
答案 1 :(得分:1)
你试过了吗?
const int HEAP=-1;
template<> class String<HEAP> {
//... specialization for Heap
};
String<HEAP> str_on_heap;
答案 2 :(得分:1)
据我所知,您想要的语法是不可能获得的:您希望String
同时成为类和类模板。
为了提供给定尺寸的专业化替代方案,我相信您应该查看Policy Based Design,并提供以下政策:
String<HeapStorage> heapStr;
String<StackStorage<512> > stackStr;
从我的观点来看,这是更好的设计:更好的阅读,更好地理解而不看实现,并且不依赖于'无效大小'魔术值。