假设我有以下两个相同的函数,但参数不同,我想将它们合并为一个函数。我该怎么做?
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 << "}";
}
这是假设运算符 <<(ostream& os, const pair< K, V > p) 已经定义,因此映射 cout << 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!
最佳答案
使用模板。将公共(public)代码拉入一个单独的函数。
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);
}
关于c++ - 如何将类似的重载函数折叠成一个 C++ 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33583448/