Boost logo

Boost :

From: Vinnie Falco (vinnie.falco_at_[hidden])
Date: 2024-12-19 23:56:40


On Thu, Dec 19, 2024 at 2:20 PM Andrzej Krzemienski <akrzemi1_at_[hidden]>
wrote:

> ...if there was a left-to-right solution devoid of the above problems, I
> would take it.
>

Very good point. Here is a sketch of what a non-intrusive, left-to-right
solution:

    std::unordered_map< int, char > m;

    upgrade(m).try_find( 1 ).map(
        []( auto&& v )
        {
            std::cout << "not empty";
            return v;
        }
    );

Check it out on https://godbolt.org/z/jKzqbs3nj

    #include <optional>
    #include <boost/optional.hpp>
    #include <iostream>

    template< typename T >
    concept associative_map = requires( T )
    {
        typename T::value_type;
    };

    template< associative_map M >
    struct upgrade_wrapper
    {
        explicit upgrade_wrapper( M& m )
            : m_(m)
        {
        }

        template< typename Key >
        auto
        try_find( Key&& k ) ->
            boost::optional< typename M::value_type& >
        {
            auto it = m_.find( std::forward< Key > ( k ) );
            if( it != m_.end() )
                return *it;
            return {};
        }

    private:
        M& m_;
    };

    template< associative_map M >
    auto
    upgrade( M& m ) -> upgrade_wrapper< M >
    {
        return upgrade_wrapper< M >(m);
    }

    int main()
    {
        std::unordered_map< int, char > m;

        upgrade(m).try_find( 1 ).map(
            []( auto&& v )
            {
                std::cout << "not empty";
                return v;
            }
        );
    }

Thanks


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk