C++ 有没有办法从map::find()获得boost::可选结果?

C++ 有没有办法从map::find()获得boost::可选结果?,c++,boost,C++,Boost,给定一个std::mapm,我可以: const auto iterator = m.find(k); if (iterator != m.end()) { const auto& value = iterator->second; // ... } 我想做同样的事情,但是使用boost::optional。比如: const auto o = boost::find_optional(m, k); if (o) { const auto& val

给定一个
std::map
m
,我可以:

const auto iterator = m.find(k);
if (iterator != m.end())
{
    const auto& value = iterator->second;
    // ...
}
我想做同样的事情,但是使用
boost::optional
。比如:

const auto o = boost::find_optional(m, k);
if (o)
{
    const auto& value = o.get();
    // ...
}

已经有这样的事了吗

这个版本解决了我在其他答案中注意到的一些限制:

namespace stl { 

    namespace map {

        namespace detail {
            template <typename K, typename Map>
            static auto lookup(K const &key, Map &&map) -> boost::optional<decltype(map.at(key)) &> {
                auto it = map.find(key);
                if (it != map.end())
                    return it->second;
                return boost::none;
            }
        } // namespace detail

        template <typename K, typename Map>
        static decltype(auto) lookup(K const &key, Map &&map) {
            return detail::lookup(key, std::forward<Map>(map));
        }

        template <typename K, typename Map>
        static decltype(auto) lookup(boost::optional<K> const &key, Map &&map) {
            return key ? (lookup)(*key, std::forward<Map>(map)) : boost::none;
        }

    }

    using map::lookup;
    //using set::lookup;   // extended ideas
    //using map::contains;
    //using set::contains;
}

为什么在这里使用
%%
std::forward
很重要?
#include <iostream>
#include <boost/optional/optional_io.hpp>

using stl::lookup;

template <typename Map>
void traverse(char const* startkey, Map const& m) {
    std::cout << "\nTraverse from " << startkey << ":\n";
    auto cursor = lookup(startkey, m);

    do std::cout << "Lookup result: " << cursor << "\n";
    while (cursor = lookup(cursor, m));
}

int main() {

    std::map<std::string, std::string> m { 
        { "Hello", "World" },
        { "World", "Peace" },
        { "Peace", "Troops" },
    };

    traverse("Hello", m);

    // mutation:
    if (auto peace = lookup("Peace", m))
        *peace = "Love";

    traverse("Hello", m);
}
Traverse from Hello:
Lookup result:  World
Lookup result:  Peace
Lookup result:  Troops

Traverse from Hello:
Lookup result:  World
Lookup result:  Peace
Lookup result:  Love