#include #include #include #include #include template< typename Iterator > struct iterator_something { iterator_something( Iterator const& first, Iterator const& last ) : _first( first ), _last( last ) {} std::size_t distance() { return std::distance( _first, _last ); } Iterator _first, _last; }; template< typename Container > struct container_something : boost::base_from_member< Container > , iterator_something< typename boost::remove_reference< Container >::type::iterator > { typedef boost::base_from_member< Container > container_member; explicit container_something( Container& container ) : boost::base_from_member< Container >( container ) , iterator_something< typename boost::remove_reference< Container >::type::iterator >( container_member::member.begin(), container_member::member.end() ) {} }; int main() { std::vector< int > v; v.push_back( 0 ); v.push_back( 1 ); v.push_back( 2 ); container_something< std::vector< int > > something_copy( v ); something_copy.distance(); // right container_something< std::vector< int >& > something_ref( v ); something_ref.distance(); // wrong }