Я только начинаю с шаблонного метапрограммирования, поэтому я просто пытаюсь начать с некоторых основных вещей. У меня есть методы и методы 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
в строке (*)
, а затем вывод был случайным мусором.