#include #include #include template concept ConstDereferenceable = requires(Type type) { { *type } -> std::same_as; // { *type } -> std::convertible_to; }; //= template concept Dereferenceable = requires(Type type) { { *type } -> std::same_as; }; //iterable struct Iterable { Iterable &operator++(); Iterable operator++(int); int const &operator*() const; int &operator*(); }; //= template concept InIterator = ConstDereferenceable; template void inFun(Type tp) {} template concept OutIterator = Dereferenceable; template void outFun(Type tp) {} int main() { inFun(Iterable{}); outFun(Iterable{}); }