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:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.