join_find

せっかく可変引数テンプレートがあるのだから、複数のRangeに対する操作を行うアルゴリズムもあっていいんじゃないかと思った。

以下は、複数のmapから検索を行うjoin_find()関数。

optional<T> join_find(key, m1, m2, ...);
#include <boost/optional.hpp>

template <class Key, class Map>
auto join_find(const Key& key, const Map& map)
    -> boost::optional<typename Map::mapped_type>
{
    auto it = map.find(key);
    if (it != map.end()) {
        return it->second;
    }
    else {
        return boost::none;
    }
}

template <class Key, class HeadMap, class... TailMaps>
auto join_find(const Key& key, const HeadMap& head, const TailMaps&... tail)
    -> boost::optional<typename HeadMap::mapped_type>
{
    auto it = head.find(key);
    if (it != head.end())
        return it->second;
    else
        return join_find(key, tail...);
}

#include <iostream>
#include <map>
#include <string>
int main()
{
    std::map<std::string, int> m1 = {
        {"3rd", 3},
        {"1st", 1}
    };

    std::map<std::string, int> m2 = {
        {"4th", 4}
    };

    if (boost::optional<int> result = join_find("4th", m1, m2)) {
        std::cout << result.get() << std::endl;
    }
    else {
        std::cout << "not found" << std::endl;
    }
}

出力:

4