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