
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?