C++0x explicit concept と implicit concept

concept には、先頭に auto を付けるものと付けないものがあります。


concept の先頭に auto を付けるものは implicit concept というもので、コンセプトの要件を満たさなければならない、というもの

#include <vector>

auto concept Range<class X> {
    typename iterator = X::iterator;

    iterator X::begin();
    iterator X::end();
}

template <class Iterator>
void algo(Iterator first, Iterator last)
{
    ...
}

template <Range Rng>
void foo(Rng& r)
{
    algo(r.begin(), r.end());
}

int main()
{
    std::vector<int> v;
    foo(v); // OK
}


auto を付けないものは explicit concept というもので、コンセプトの要求を満たすように concept_map を書かなければならないもの
(※ concept を書いただけではダメ)

#include <vector>

concept Range<class X> {
    typename iterator;

    iterator begin(X&);
    iterator end(X&);
}

template <std::Container X>
concept_map Range<X> {
    typedef X::iterator iterator;

    iterator begin(X& x) { return x.begin(); }
    iterator end(X& x)   { return x.end(); }
};

template <class Iterator>
void algo(Iterator first, Iterator last)
{}

template <Range Rng>
void foo(Rng& r)
{
    algo(begin(r), end(r));
}

int main()
{
    std::vector<int> v;
    foo(v); // OK
}