mapの検索と値取得の続き
Steven Watanabeさんが「ポインタでいいじゃん」と言ってて、
ポインタを直接使うのがイヤだったので、ポインタをラップしたptr_optionalを用意しました。
ユーザーコードは、昨日のとほとんど変わりません。(optionalがptr_optionalになっただけ)
#include <iostream> #include <map> #include <string> template <class T> class ptr_optional { const T* p_; public: ptr_optional() : p_(0) {} ptr_optional(const T* p) : p_(p) {} const T& get() const { return *p_; } operator bool() const { return p_ != 0; } bool operator!() const { return !p_; } }; template <class Map, class Key> ptr_optional<typename Map::mapped_type> map_find(const Map& m, const Key& key) { typedef ptr_optional<typename Map::mapped_type> result_type; typename Map::const_iterator it = m.find(key); return it != m.end() ? result_type(&it->second) : result_type(); } int main() { std::map<std::string, int> m; m["Akira"] = 24; m["Millia"] = 16; m["Johnny"] = 38; if (ptr_optional<int> value = map_find(m, "Akira")) std::cout << value.get() << std::endl; else std::cout << "Not Found" << std::endl; }
追記:
optional
#include <iostream> #include <map> #include <string> #include <boost/optional.hpp> template <class Map, class Key> boost::optional<typename Map::mapped_type const&> map_find(const Map& m, const Key& key) { typedef boost::optional<typename Map::mapped_type const&> result_type; typename Map::const_iterator it = m.find(key); return it != m.end() ? result_type(it->second) : result_type(); } int main() { std::map<std::string, int> m; m["Akira"] = 24; m["Millia"] = 16; m["Johnny"] = 38; if (boost::optional<const int&> value = map_find(m, "Akira")) std::cout << value.get() << std::endl; else std::cout << "Not Found" << std::endl; }