增强 C++ 函数以除了 std::string 之外还采用 stringstream

enhancing a c++ function to take stringstream in addition to std::string

本文关键字:stringstream string 增强 函数 std C++      更新时间:2023-10-16

可能的重复项:
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");

具有可变参数数量的接口比在函数调用中笨拙地使用 shift 运算符更整洁、更直接,因为后者需要显式创建一个流对象,然后你需要直接处理流的低级rdbuf,并且这种方法不会将原始的无参数版本作为特例。

您可以创建一个返回字符串流的模板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("something"<<some_obj);