2008-08-17

コンセプトで代入演算子を使う方法

さて、コンセプトでは、代入演算子はメンバ関数として宣言しなければならない。しかし、メンバ関数は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: