読者です 読者をやめる 読者になる 読者になる

C++0xではメタ関数をコンセプトで書く(かも)

C++

C++03だと依存名に対してtypenameを付けないといけないので
メタ関数書くとけっこう長くなってしまいます。

template <class T>
struct identity {
    typedef T type; // これはいいんだけど
};

template <class T>
struct add_pointer {
    // メタ関数内でメタ関数呼んだりするとtypename付けるのめんどくさい
    typedef typename identity<T>::type* type;
};

C++0xでは、コンセプト内で型を制約することによりそれが型であることが明示的になるから
そのコンセプトを使う側ではtypenameを書かなくてもいいので、
メタ関数もコンセプトで書いちゃえばtypename省略できるんじゃないかと思ってます。

auto concept AddPointer<T> {
    typename type = T*;
}

template <class T>
struct add_pointer {
    typedef AddPointer<T>::type type; // typenameいらない!
};


ConceptGCC 4.3.0 Alpha 7だと、実装中だからなのか上記のコードはエラーになります。
コンセプトマップ使えばいけるかなと思ったら

concept AddPointer<class T> {
    typename type;
}

template <class T>
concept_map AddPointer<T> { // エラー!そんな部分特殊化はできないよ
    typedef T* type;
}

エラーになって、しょうがないのでこうしたら動いた

concept AddPointer<class T> {
    typename type;
}

template <class T>
concept_map AddPointer<T*> { // T → T*
    typedef T** type;
}

template <class T>
struct add_pointer {
    typedef AddPointer<T>::type type; // OK
};

typedef shand::add_pointer<int*>::type type; // int**

懸念事項は、再帰できるかどうかかな。