Я пытался придумать умный способ объединить различные вещи в один строковый аргумент для функции без необходимости явно использовать ostringstream
.Я думал о:
#define OSS(...) \
dynamic_cast<std::ostringstream const&>(std::ostringstream() << __VA_ARGS__).str()
Однако, учитывая:
void f( string const &s ) {
cout << s << endl;
}
int main() {
char const *const s = "hello";
f( OSS( '{' << s << '}' ) );
ostringstream oss;
oss << '{' << s << '}';
cout << oss.str() << endl;
}
, он печатает при запуске:
123hello}
{hello}
, где 123 - код ASCII для }
,Почему использование макроса приводит к ошибкам?
К вашему сведению: в настоящее время я использую g ++ 4.2.1 на Mac OS X как часть Xcode 3.x.
Решение I 'м теперь с помощью
class string_builder {
public:
template<typename T>
string_builder& operator,( T const &t ) {
oss_ << t;
return *this;
}
operator std::string() const {
return oss_.str();
}
private:
std::ostringstream oss_;
};
#define BUILD_STRING(...) (string_builder(), __VA_ARGS__)
using namespace std;
void f( string const &s ) {
cout << s << endl;
}
int main() {
char const *const s = "hello";
f( BUILD_STRING( '{', s, '}' ) );
}