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 }