В C ++ возможно определить класс, используемый как: SomeObj obj1; SomeObj <4> obj2; - PullRequest
1 голос
/ 11 декабря 2010


Я хочу реализовать строковый класс, который имеет возможность создать внутренний буфер в стеке или куче. Так что я думаю о появлении этой строки как:

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 ]

2 голосов
/ 11 декабря 2010

Если класс 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 голос
/ 11 декабря 2010

Синтаксис, который вы хотите получить, насколько мне известно, невозможно получить: вы хотите, чтобы String был одновременно и классом, и шаблоном класса.

Просто чтобы предоставить альтернативу специализации для данного размера,Я считаю, что вы должны взглянуть на Дизайн на основе политик и предоставить такие политики, как:

String<HeapStorage> heapStr;
String<StackStorage<512> > stackStr;

С моей точки зрения, это лучший дизайн: лучше читать, лучше понимать безглядя на реализацию, и не полагается на магическое значение «недопустимый размер».

1 голос
/ 11 декабря 2010

Вы пробовали:

 const int HEAP=-1;
 template<> class String<HEAP> {
     //... specialization for Heap
 };

 String<HEAP> str_on_heap;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...