Я пытаюсь написать макрос, который позволит мне сделать что-то вроде: FORMAT(a << "b" << c << d)
, и результатом будет строка - то же самое, что и создание ostringstream, вставка 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 по существу одинаковыми?
Я подозреваю, что вариативные шаблоны С++ 0x сделают возможным format(a, "b", c, d)
. Но есть ли способ решить это сейчас?