## Struct template member_access_traits

hamigaki::member_access_traits —

cv修飾のメンバ変数への伝播を模倣する

## Synopsis

    template<typename T, typename U>
    struct member_access_traits {
      // types
      typedef U               value_type;
      typedef /* see below */ reference;
      typedef /* see below */ pointer;
    };

## Description

C++ではオブジェクトのcv(`const`/`volatile`)修飾がメンバ変数へのアクセスに伝播される。`member_access_traits`クラステンプレートはこのcv修飾の伝播を模倣し、メンバ変数にアクセスした際の型を返す一種のメタ関数である。このクラステンプレートは次のようなメンバ変数を返す関数テンプレートを作成するのに役に立つ。

    template<class T>
    typename hamigaki::member_access_traits<
        T,
        typename T::value_type
    >::reference
    front(T& x)
    {
        return *(x.begin());
    }

メンバの意味は次の通り。

メンバ | 説明
--- | ---
`member_access_traits<T, U>::value_type` | `U`
`member_access_traits<T, U>::reference` | 型`T`のオブジェクトから型`U`のメンバへアクセスした場合の参照型
`member_access_traits<T, U>::pointer` | 型`T`のオブジェクトから型`U`のメンバへアクセスした場合のポインタ型

`reference`と`pointer`は次のようになる。

`T` | `U` | `reference` | `pointer`
--- | --- | --- | ---
`foo` | `bar` | `bar&` | `bar*`
`const foo` | `bar` | `const bar&` | `const bar*`
`const foo` | `bar&` | `bar&` | `bar*`
`foo` | `const bar` | `const bar&` | `const bar*`
`volatile foo` | `const bar` | `const volatile bar&` | `const volatile bar*`

| 製作著作 © 2006-2008 Takeshi Mouri