0

可能重复:
C++ 在 << 作为参数之后使用字符串流

我有这样的功能

print(const std::string& message);

我怎样才能把它包在其他地方,这样我就可以使用了,比如说

print2("some message"<<object);

这应该在内部调用上述函数。

4

2 回答 2

2

这是使用可变参数模板的 C++11 解决方案:

void print(std::string const & message);   // your original function as before

void print2(std::istringstream & iss)
{
    print(iss.str());
}

template <typename T, typename ...Rest>
void print2(std::istringstream & iss, T && t, Rest &&... rest)
{
     iss << std::forward<T>(t);
     print2(iss, std::forward<Rest>(rest)...);
}

template <typename ...Args>
void print2(Args &&... args)
{
     std::istringstream iss;
     print2(iss, std::forward<Args>(args)...);
}

用法:

print2("Some message", x, foo, "text");

与在函数调用中笨拙地使用移位运算符相比,具有可变数量参数的接口更简洁,更直接,因为后者需要您显式创建流对象,然后您需要处理流的低- levelrdbuf直接,并且该方法不会将原始的无参数版本作为特例。

于 2012-09-24T09:33:26.790 回答
0

您可以创建一个operator<<返回字符串流的模板

template<class T>
std::stringstream operator<<(const char* c_str, T t)
{
   std::stringstream tmp;

   tmp << t;

   return tmp;
}

那么你需要定义

void print2(std::stringstream sstream)
{
    print(sstream.str())
}

你也可以重载原始的 print 方法,这样你也可以写得很好

print("something"<<some_obj);
于 2012-09-24T09:24:28.793 回答