如何将类似的重载函数折叠成一个函数C ++?

时间:2015-11-07 13:48:04

标签: c++ c++11

假设我有以下两个相同的函数但具有不同的参数,我想将它们折叠成一个函数。我怎么能这样做?

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!

1 个答案:

答案 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);
}