#include #include #include //#include template struct isEqual { enum { equal = false }; }; template struct isEqual { enum { equal = true }; }; template concept same = isEqual::equal; ////////////////////////////////// template concept ReturnType = requires(Type par) { { par[0] } -> std::same_as; // par[..] returns a Ret // no type constraints: // { par } -> isEqual::equal; // par returns a Ret // { par << 1 } -> isEqual::equal; // { par } -> same; // { par } noexcept; {++par}; // same as: // ++par; }; /////////////////////////////// struct XX { void operator++() {}; std::string operator[](int idx) const { return std::string{"a"}; } }; template requires ReturnType Ret ret(Type tp) { return tp[0]; } using namespace std; int main() { ret(XX{}); }