我有一个关于STL容器的例子,所以我正在阅读相关内容。对我来说,反复使用for循环打印容器内容变得非常乏味。因此,我考虑重载插入运算符<<,这样我就可以写成:
std::cout << container << std::endl;
。template<class T>
std::ostream& operator<<(std::ostream& out, const std::list<T>& v) {
for (const auto& e : v)
out << e << ", ";
return out;
}
int main() {
std::list<int> vi{ 10, 24, 81, 57, 2019 };
vi.pop_back();
std::cout << vi << std::endl; // 10, 24, 81, 57,
std::deque<std::string> names{ "Hello", "STL Containers" };
std::cout << names << std::endl; // error here. Bacause I've not overloaded << to take a std::deque<T>
}
如上所述,我觉得打印某种类型的list
非常方便。但问题是我只能打印列表,而不能打印其他类型的容器,比如vector
或deque
...
那么如何重载<<
来接受T<U>
类型的容器呢?或者说我应该为所有容器专门定义吗?在真实的例子中,我不应该这样做吗?
std::string
- 为所有容器生成插入运算符会导致可诊断错误,因为每当您尝试输出这些容器时都存在两个同样可行的插入运算符,并且没有理由优先选择一个而非另一个。 - Peter