可能重复:
C++ 在 << 作为参数之后使用字符串流
我有这样的功能
print(const std::string& message);
我怎样才能把它包在其他地方,这样我就可以使用了,比如说
print2("some message"<<object);
这应该在内部调用上述函数。
可能重复:
C++ 在 << 作为参数之后使用字符串流
我有这样的功能
print(const std::string& message);
我怎样才能把它包在其他地方,这样我就可以使用了,比如说
print2("some message"<<object);
这应该在内部调用上述函数。
这是使用可变参数模板的 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
直接,并且该方法不会将原始的无参数版本作为特例。
您可以创建一个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);