同样适用于std::wostream 的通用形式:
template <typename CharT, typename Traits>
std::basic_ostream<CharT, Traits> &
Print(std::basic_ostream<CharT, Traits> &out)
{
return out;
}
template <typename CharT, typename Traits, typename T>
std::basic_ostream<CharT, Traits> &
Print(std::basic_ostream<CharT, Traits> &out, T &&t)
{
return (out << std::forward<T>(t));
}
template <typename CharT, typename Traits, typename T, typename... Args>
std::basic_ostream<CharT, Traits> &
Print(std::basic_ostream<CharT, Traits> &out, T &&t, Args &&...args)
{
return Print( Print(out, std::forward<T>(t)), std::forward<Args>(args)... );
}
在常见情况下,我无法使其与 std::endl 一起使用(在特定情况下可以处理 std::endl,例如当它是第一个或最后一个参数时,但不是在常见情况下,尤其是如果单个呼叫中有多个std::endl)。如果您确实需要 std::endl,您仍然可以使用 '\n' 或使用 std::endl 指定模板参数:
Print(std::cout, "hello world", std::endl<char, std::char_traits<char>>);
std::endl 和 '\n' 之间的 differences
- 如果流在二进制模式下工作,则
'\n' 不会转换为编译代码所针对的平台的行尾格式(但在文本模式下仍会转换)。
-
'\n' 不会用std::flush 刷新流(但如果程序在终端上运行,它仍然是flushes std::cout)
所以对我来说可以使用'\n',甚至可以使用preferred。
仍然可以使用其他一些 IO 操纵器:
Print(std::cout, std::hex, 11, '\n');
我还实现了sprintf 对应物,它与可变参数模板一起使用并返回std::string:
template <typename CharT = char, typename Traits = std::char_traits<CharT>, typename... Args>
std::basic_string<CharT, Traits>
SPrint(Args &&...args)
{
std::basic_stringstream<CharT, Traits> ss;
Print(ss, std::forward<Args>(args)...);
return std::move(ss.str());
}
这里有一些demos。