2008-08-19

Conceptを使うと書けないジェネリックなコード

以下のコードはまったく問題の無いC++0xのコードである。

template < typename T > void f( T x )
{
    x.value ;
}

struct Bar
{
    int value ;
} ;

int main()
{
    f(Bar()) ;
}

見ての通り、このコードは、template parameter T がメンバ変数 value を持っていることを要求している。このコードはジェネリックなコードのはずだ。

さて、できることならば、この関数テンプレートにコンセプトを導入したい。しかし、それは不可能だ。なぜならば、コンセプトでメンバ変数を要求することはできない。では一体どうすればいいのか。こうすればいいのではないかと思うのだが、なぜかコンパイルが通らない。

auto concept Foo < typename T >
{
    requires std::CopyConstructible< T > ;
    typename value_type ;
    requires std::CopyAssignable< value_type, int > ;
    value_type & value(T & x) { return x.value ; }
}

template < typename T > requires Foo< T >
void f( T x )
{
    value(x) = 0 ;
}

No comments: