Я пытаюсь написать макрос, который позволит мне сделать что-то вроде: 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). Но есть ли способ решить это сейчас?