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

标签 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 << "}";
}

这是假设运算符 <<(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/

相关文章:

c++ - 真正测试std::atomic是否无锁

c++11 - Foreach 在特征矩阵上循环?

c++ - 在哪些平台上线程本地存储受到限制,可用的空间有多少?

c++对模板类的用户定义运算符的隐式转换

c++ - 我可以将 map 迭代器与 OpenMP 并行使用吗?

c++ - 如何检查两个位图上的值?

C++11 - 绑定(bind)排序函数

c++ - OpenCV C++ 视频捕获图像背景减法

c++ - if 语句的一个分支不能只是一个声明?

c++ - 为什么在初始化元素多于数组大小时的数组容器时不会出现错误?