c++ - 为序列重载 ostream << 运算符

标签 c++ operator-overloading ostream

我想通过将容器的第一个和最后一个元素作为参数来定义运算符 << 以对一系列元素进行操作,就像 STL 算法的工作方式一样。与只采用一个参数相反,容器本身,例如

std::ostream& operator<< ( std::ostream &out, std::list inList );

这样一来,无论我是否使用列表、 vector 、数组等,我都只需编写一个可以正常工作的函数。而且我必须使用两个参数调用该函数,inList.begin() 和 inList。结束()

问题是 operator<< 只接受一个参数。克服这个问题的最佳方法是什么?

编辑:感谢您的回答。我可能应该更清楚地表明我更愿意能够打印一系列元素,包括可能的容器子序列(同样,像 STL 算法)。例如。如果 vector v 有 5 个元素,我希望可以打印它们,给出从 v.begin() 到 v.end() 的序列,输出如下:

[element1 element2 element3 element4 element5]

但我希望我也可以只打印前三个,在 [v.begin(), v.begin()+3) 范围内

[element1 element2 element3]

在这种情况下,您建议的答案是否有效?

最佳答案

您无法避免传递一个参数,但您希望某些东西适用于任何类型的容器。所以理想情况下你会想要一个像

这样的函数
template <typename T>
std::ostream& someFunction(std::ostream& out, T first, T last) {
  // do your stuff
}

和一个ostream& operator<<看起来像东西

template <T>
std::ostream& << (std::ostream& out, const T& sequence) {
  return someFunction(out, sequence.begin(), sequence.end());
}

但是,此运算符会与预定义的运算符发生冲突,因此您不能就这样实现它。幸运的是,您可以玩一些模板魔术来解决这个问题,要查看一个非常好的解决方案,请查看 this SO question和相应的github project

请注意,因为(大概)目标是拥有一个通用的 ostream& operator<<对于容器,您可以通过函数模板实现这一点,让函数采用迭代器并不是必需的。它也可以使用对容器的(常量)引用。

关于c++ - 为序列重载 ostream << 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10852125/

相关文章:

c++ - 通过指针访问 char*

c# - 隐式方法组转换陷阱(第 2 部分)

c++ - 类没有成员 "operator<<"

分离的 cpp 上的 C++ ostream 重载

C++运算符重载无法输出+运算

c++ - 使用 copy 和 ostream_iterator 删除为 vector 编写的 CSV 文件中的尾随逗号

c++ - 当这个容器也是容器的元素时,为什么容器的迭代器失效?

c++ - 如何防止用户读取存储在二进制文件中的字符串?

c++ - 正在创建重复的 USB 虚拟串行端口 - 这可能是什么原因造成的?

c++ - 用户定义的重载运算符 * 与 std::chrono::duration