在C ++中,是否可以定义一个用作以下类的类:SomeObj obj1; someObj中&LT 4是氢; obj2的;

时间:2010-12-11 09:25:54

标签: c++ templates macros


我想实现一个字符串类,它具有在堆栈或堆上创建内部缓冲区的选项。所以我想起那个字符串的外观,如:

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 ++技巧来提供这样的界面? 谢谢!

3 个答案:

答案 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;

从我的观点来看,这是更好的设计:更好的阅读,更好地理解而不看实现,并且不依赖于'无效大小'魔术值。