$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Zeljko Vrba (zvrba_at_[hidden])
Date: 2008-08-21 13:21:49
I have succeeded in writing the following transform functor:
typedef bf::map<bf::pair<net, unsigned>, bf::pair<pin, unsigned> > Map;
typedef bf::vector<unsigned, unsigned> Pair;
struct Map2Pair
{
    template<typename Sig>
    struct result;
    template<typename U>
    struct result<Map2Pair(U)>
    : remove_reference<T::second_type>
    { };
    template<typename T>
    typename T::second_type operator()(T t) const
    {
        return t.second;
    }
};
I have tested it, it works.  The result magic has been copied from the
transform_view example in the documentation and adjusted for the proper return
type.  Where can I read a bit more about result conventions?  In particular,
how does the
    template<typename U>
    struct result<Map2Pair(U)>
    : remove_reference<T::second_type>
    { };
specialization work when Map2Pair is a struct, and it doesn't even have a 
constructor!   Even worse, why does it work at all when T is not in the
scope of the template (.. because it's never used?)  Yes, it is not used,
the following functor also works:
struct Map2Pair
{
    template<typename T>
    typename T::second_type operator()(T t) const
    {
        return t.second;
    }
};
When and how is the above version preferred than the simpler version?