【发布时间】:2015-10-13 18:16:57
【问题描述】:
我正在尝试重载
list<string> string_list = ...;
vector<double> double_vector = ...;
set<list<int>> int_list_set = ...;
cout << string_list << double_vector << int_list_set << endl;
该站点的另一位用户 Chris Redford 在 How to print out the contents of a vector? 上发布了一些有用的代码,用于使用向量执行此操作。我试图调整他的代码以与其他类型的集合一起使用,如下所示:
template <template <typename...> class collection, typename T>
std::ostream& operator<<(std::ostream& out, const collection<T>& c) {
out << "[ ";
out << *c.begin();
for(auto it=next(c.begin(),1); it!=c.end(); ++it) {
out << " , ";
out << *it;
}
out << " ]";
return out;
}
显然,在编写模板方面我是个菜鸟,因此欢迎任何有关阅读材料的提示。希望很明显,我希望它适用于任何可以做 .begin() 和 .end() 的事情。使用
编译时int main(int argc, char **argv) {
list<string> words;
words.push_back("hello");
words.push_back("world");
cout << words << endl;
}
,我收到一个编译器错误,提示“'operator
编辑:更正了原始问题中对 T... 的错误使用。
【问题讨论】:
-
为什么要使用模板参数包,即 typename...?我看不出有必要。
-
我的建议:不要这样做。该模板不是特定的并且可能是有害的(防止专用容器的过载选择)。但这只是一个猜测。如果您将其用于调试,请使用宏。
-
@user2672165 正如我所说,我是模板新手,但我认为如果我想让它适用于泛型的泛型,比如 list
>,这种事情是必要的。 -
@DieterLücking 那么您的建议是拥有一个包含所有不同容器的 Chris Redford 代码版本吗?我认为模板的目的是避免这样的事情。另外,由于模板调用了 .begin() 和 .end(),看起来这不会对任何没有的东西有害,对吗?
-
代替重载
标签: c++ templates operator-overloading c++14 c++-standard-library