以下のコードはまったく問題の無い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