我想通过将容器的第一个和最后一个元素作为参数来定义运算符 << 以对一系列元素进行操作,就像 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/