我想创建一个模板来打印任何容器,其元素可以由 std::cout 或任何其他流打印。
我想知道它应该打印到哪个流中,因此我需要以某种方式将目标流作为参数传递?下面是我想出的代码。但是有几个问题我还没有弄清楚
如果我使用
fprintf()
然后我可以直接将 stream
作为参数传递给 fprintf
但问题是元素需要是一个 char *
而 std::cout 将负责类型转换我想很多更容易?
template<template<typename...> typename C, typename E, typename S>
void my_printer(const C<E>& container,
S separator = ' ',
FILE *stream = stdout) {
typename C<E>::size_type index = 0;
typename C<E>::size_type lastIndex = container.size() - 1;
for (const auto& element: container) {
if (stream == stdout) {
std::cout << element;
if (index < lastIndex) {
std::cout << separator;
}
} else if (stream == stderr) {
std::cerr << element;
if (index < lastIndex) {
std::cerr << separator;
}
}
index++;
}
}
将参数更改为
std::ostream &
:
template<template<typename...> typename C, typename E, typename S>
void my_printer(const C<E>& container,
S separator = ' ',
std::ostream &stream=std::cout) {
现在,您可以传递
std::cerr
或明确地传递 std::cout
(如果您愿意),然后使用所有常规的流格式操作。
C++23 支持
std::print
可以写入 FILE
:
template <typename Container>
void my_printer(const Container& container,
char separator = ' ',
FILE *stream = stdout) {
typename Container::size_type index = 0;
typename Container::size_type lastIndex = container.size() - 1;
for (const auto& element: container) {
std::print(stream, "{}", element);
if (index < lastIndex) {
std::print(stream, "{}", separator);
}
index++;
}
}
这里是一个使用{fmt}库的例子,
std::print
基于:https://godbolt.org/z/M684WMfP6.
免责声明:我是 {fmt} 和 C++23 的作者
std::print