member_access_traits
メンバへのcv修飾伝播を模倣するmember_access_traitsを作りました。
http://hamigaki.sourceforge.jp/hamigaki/type_traits/member_access_traits.hpp
namespace hamigaki { template<class T, class U> struct member_access_traits { typedef typename boost::remove_reference<T>::type class_type; typedef typename boost::mpl::if_< typename boost::is_const<class_type>::type, typename boost::mpl::if_< typename boost::is_volatile<class_type>::type, typename boost::add_cv<U>::type, typename boost::add_const<U>::type >::type, typename boost::mpl::if_< typename boost::is_volatile<class_type>::type, typename boost::add_volatile<U>::type, U >::type >::type member_type; // メンバ本来の型 typedef U value_type; // メンバの参照型 typedef typename boost::add_reference<member_type>::type reference; // メンバのポインタ型 typedef typename boost::add_pointer<member_type>::type pointer; }; } // End namespaces hamigaki.
例えば、構造体hogeのint型メンバをconst hoge型のhから参照したときの参照型は、
member_access_traits<const hoge,int>::reference
で調べることができます。
表にするとこんな感じです。
T | U | reference |
---|---|---|
hoge | int | int& |
const hoge | int | const int& |
const hoge | int& | int& |
hoge | const int | const int& |
volatile hoge | const int | const volatile int& |
これを使うことで、first_iteratorをWritableにすることが可能になりました。
http://hamigaki.sourceforge.jp/hamigaki/iterator/first_iterator.hpp
http://hamigaki.sourceforge.jp/libs/iterator/test/first_iterator_test.cpp