さて、コンセプトでは、代入演算子はメンバ関数として宣言しなければならない。しかし、メンバ関数はconcept_mapで定義できない。以下のような例はどうすればいいのか。
auto concept MyConcept< typename T >
{
requires std::CopyConstructible< T > ;
T T::operator +=(T const &) ;
}
template < typename T > requires MyConcept< T >
void func( T x )
{
x += 1 ;
}
struct Foo
{
int value ;
} ;
concept_map MyConcept< Foo >
{
//エラー、メンバ関数は定義できない。
Foo Foo::operator +=(Foo const &)
{
this->value += value ;
return *this ;
}
}
int main()
{
Foo foo ;
foo.value = 10 ;
func(foo) ;
}
このケースに、Herb Sutterとかの偉い人の論理を適用すると、こうなるのだろう。
auto concept MyConcept< typename T >
{
requires std::CopyConstructible< T > ;
T assign_add(T & l, int r){ l += r ; }
}
template < typename T > requires MyConcept< T >
void func( T x )
{
assign_add(x, 1) ;
}
struct Foo
{
int value ;
} ;
concept_map MyConcept< Foo >
{
Foo assign_add(Foo & l, int r)
{
l.value += r ;
return l ;
}
}
int main()
{
Foo foo ;
foo.value = 10 ;
func(foo) ;
}
このようにすれば、すでにoperator +=が定義されている型はそのまま使えるし、concept_mapによる、すり合わせというか都合あわせというか、定義もできる。しかし問題は、begin()のような例ならいいとしても、代入演算子にたいしてまで、こうする必要があるのだろうか
No comments:
Post a Comment