根据函数参数选择标准输出或标准错误

问题描述 投票:0回答:2

我想创建一个模板来打印任何容器,其元素可以由 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++;
  }
  
}
c++ templates iostream
2个回答
4
投票

将参数更改为

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
(如果您愿意),然后使用所有常规的流格式操作。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.