せっかく可変引数テンプレートがあるのだから、複数の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