Шаблон метапрограммирования на С ++ - PullRequest
2 голосов
/ 27 октября 2011

Я только начинаю с шаблонного метапрограммирования, поэтому я просто пытаюсь начать с некоторых основных вещей. У меня есть методы и методы Size и Lookup, работающие на BST, поэтому я решил попробовать создать класс String. У меня есть этот код в файле cpp:

#include <iostream>
#include <string>
using namespace std;

struct Null;

// String
template <char C, typename S>
struct String {
  static const char chr = C;
  typedef S tail;
};

// ToString
template <typename S>
struct ToString;

template <char C, typename S>
struct ToString<String<C, S> > {
  static const string str;
};

template <char C, typename S>
const string ToString<String<C, S> >::str = C + ToString<S>::str; // (*)

template <char C>
struct ToString<String<C, Null> > {
  static const string str;
};

template <char C>
const string ToString<String<C, Null> >::str = C + ""; // to make it a string

int main() {
  typedef String<'H', String<'e', String<'l', String<'l',
             String<'o', Null> > > > > myString;
  cout << ToString<myString>::str << endl;
  return 0;
}

Этот код выводит «Ад», когда я его запускаю. Что я делаю не так в базовом случае? Похоже, что-то связано с "", потому что я имел обыкновение C + ToString<S>::str как "" + C + ToString<S>::str в строке (*), а затем вывод был случайным мусором.

1 Ответ

3 голосов
/ 27 октября 2011

"" + C + ToString<S>::str сначала выполняет добавление указателя, а затем только последующую конкатенацию, чтобы выполнить конкатенацию строк полностью std::string("") + C + ToString<S>::str

...