我试图想出一种巧妙的方法,将各种内容连接到函数的单个字符串参数中,而无需显式使用 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 码。为什么使用宏会出错?

仅供引用:我目前在 Mac OS X 上使用 g++ 4.2.1 作为 Xcode 3.x 的一部分。

我现在正在使用的解决方案
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, '}' ) );
}

最佳答案

一个更好的线程安全解决方案,不涉及繁琐的宏。

对函数的原始调用是这样的:

f( OSS( '{' << s << '}' ) );

如果电话只是这样呢:
 f(stringbuilder() << '{' << s << '}' );

其中 stringbuilder 实现为:
struct stringbuilder
{
   std::ostringstream ss;
   template<typename T>
   stringbuilder & operator << (const T &data)
   {
        ss << data;
        return *this;
   }
   operator string() { return ss.str(); }
};

void f( string const &s ) {
  cout << s << endl;
}

测试:
int main() {
  char const *const s = "hello";

  f(stringbuilder() << '{' << s << '}' );

}

输出:
{hello}

在线演示:http://ideone.com/QHFf4

关于c++ - ostringstream 的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5666678/

10-15 00:21