Я пытаюсь написать макрос, который позволил бы мне сделать что-то вроде: FORMAT(a << "b" << c << d)
, и результатом будет строка - то же самое, что создать поток ostring, вставить a...d
и вернуть .str()
. Что-то типа:
string f(){
ostringstream o;
o << a << "b" << c << d;
return o.str()
}
По сути, FORMAT(a << "b" << c << d) == f()
.
Сначала я попробовал:
1: #define FORMAT(items) \
((std::ostringstream&)(std::ostringstream() << items)).str()
Если самый первый элемент является строкой C (const char *
), он будет печатать адрес строки в шестнадцатеричном формате, а следующие элементы будут печататься точно. Если самым первым элементом является std::string
, он не будет скомпилирован (нет соответствующего оператора <<
).
Этот:
2: #define FORMAT(items) \
((std::ostringstream&)(std::ostringstream() << 0 << '\b' << items)).str()
дает то, что кажется правильным, но, конечно, в строке присутствуют 0
и \b
.
Следующее, похоже, работает, но компилируется с предупреждениями (с временным адресом):
3: #define FORMAT(items) \
((std::ostringstream&)(*((std::ostream*)(&std::ostringstream())) << items)).str()
Кто-нибудь знает, почему 1 печатает адрес c-строки и не компилируется с std::string
? Разве 1 и 3 по сути не одно и то же?
Я подозреваю, что вариативные шаблоны C ++ 0x сделают format(a, "b", c, d)
возможным. Но есть ли способ решить эту проблему сейчас?