Есть предварительная концепция Требования к контейнеру . Как концепция, которая выглядела бы как
template <class T>
concept container = requires(T a, const T b)
{
requires regular<T>;
requires swappable<T>;
requires erasable<typename T::value_type>;
requires same<typename T::reference, typename T::value_type &>;
requires same<typename T::const_reference, const typename T::value_type &>;
requires forward_iterator<typename T::iterator>;
requires forward_iterator<typename T::const_iterator>;
requires signed<typename T::difference_type>;
requires same<typename T::difference_type, typename std::iterator_traits<typename T::iterator>::difference_type>;
requires same<typename T::difference_type, typename std::iterator_traits<typename T::const_iterator>::difference_type>;
{ a.begin() } -> typename T::iterator;
{ a.end() } -> typename T::iterator;
{ b.begin() } -> typename T::const_iterator;
{ b.end() } -> typename T::const_iterator;
{ a.cbegin() } -> typename T::const_iterator;
{ a.cend() } -> typename T::const_iterator;
{ a.size() } -> typename T::size_type;
{ a.max_size() } -> typename T::size_type;
{ a.empty() } -> boolean;
};
, хотя вы бы хотели express часть этого как requires range<T>