Multimap 上的 C++ 泛型编程

C++ Generic Programming on Multimap

多图如下:

int main() {
    multimap<int, string> coll;
    coll = { {5, "tagged"} ,
             {2, "a"} ,
             {1, "this"} ,
             {4, "of"} ,
             {6, "strings"} ,
             {1, "is"} ,
             {3, "multimap"} 
          };
}

现在,我想得到一个像下面这样的函数模板来一个一个地打印这些容器中的所有值元素,包括multimap但不限于这种类型的地图和这对特定的模板参数.

void PrintAllMaps(multimap<int, string> map) {
    for (auto elem : map) {
        cout << elem.second << ' ';
    }
    cout << endl;
}

including multimap but not limited

如果我没理解错的话,你想要一个模板模板函数:

template <
    typename T1, 
    typename T2, 
    typename T3, 
    typename T4, 
    template <typename, typename, typename, typename> class M>
void PrintAllMaps(M<T1, T2, T3, T4>& map) {
    ...
}

请注意,std::multimap 和其他 std::map 类似的容器实际上采用了 2 个以上的模板参数,其余的具有默认类型。

Live Demo

template <class TKey>
template <class TValue>
void PrintMapToStream(std::ostream &stream, multimap<TKey, TValue> map)
{
    for (auto elem : map)
        stream << elem.second << ' ';

    stream << std::endl;
}

然后:

PrintMapToStream(std::cout, map);

我在通用容器函数方面运气不错:

template <class Map>
void PrintMapToStream(std::ostream &stream, const Map &map) {
    for (auto &elem : map)
        stream << elem.second << ' ';
    stream << std::endl;
}

当然,如果您在不允许迭代对的对象上调用它,这将失败并显示令人困惑的错误消息。