假设我有以下两个相同的函数但具有不同的参数,我想将它们折叠成一个函数。我怎么能这样做?
template <typename T>
ostream& operator<<(ostream& os, const set<T>& v) {
os << "{";
char comma[3] = {'\0', ' ', '\0'};
for (const auto& e : v) {
os << comma << e;
comma[0] = ',';
}
return os << "}";
}
template <typename F, typename S>
ostream& operator<<(ostream& os, const map<F, S>& v) {
os << "{";
char comma[3] = {'\0', ' ', '\0'};
for (const auto& e : v) {
os << comma << e;
comma[0] = ',';
}
return os << "}";
}
这假设已经定义了运算符&lt;(ostream&amp; os,const pair&lt; K,V&gt; p),因此map cout&lt;&lt; e应该正常工作。
我想要类似下面的伪代码:
template <typename F, typename S, typename X=set or map>
ostream& operator<<(ostream& os, const X<F, S>& v) {
os << "{";
char comma[3] = {'\0', ' ', '\0'};
for (const auto& e : v) {
os << comma << e;
comma[0] = ',';
}
return os << "}";
}
cout << aMap << aSet; // should work!
答案 0 :(得分:5)
使用模板。将公共代码拉入单独的函数中。
template <typename T>
ostream& WriteRange(ostream& os, const T& v) {
os << "{";
char comma[3] = {'\0', ' ', '\0'};
for (const auto& e : v) {
os << comma << e;
comma[0] = ',';
}
return os << "}";
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& v) {
return WriteRange(os, v);
}
template <typename F, typename S>
ostream& operator<<(ostream& os, const map<F, S>& v) {
return WriteRange(os, v);
}