Quero distinguir contêineres unidimensionais e bidimensionais usando conceitos. Minha primeira tentativa foi a seguinte:
template<typename C>
concept Container1D = requires(C c) {
std::begin(c);
std::end(c);
c[0];
};
template<typename C>
concept Container2D = requires(C c) {
std::begin(c);
std::end(c);
c[0, 0]; // interpreted as comma-operator
};
Mas obviamente isso não funciona, porque a expressão 0, 0
é interpretada como um operador de vírgula e, portanto, o segundo conceito também corresponde a um contêiner unidimensional.
Existe uma maneira de exigir um bidimensional operator[a, b]
?