Cómo resolver la ambigüedad en funciones sobrecargadas usando SFINAE
Tengo una biblioteca increíblemente emocionante que puede traducir puntos: debería funcionar con cualquier tipo de punto
template<class T>
auto translate_point(T &p, int x, int y) -> decltype(p.x, p.y, void())
{
p.x += x;
p.y += y;
}
template<class T>
auto translate_point(T &p, int x, int y) -> decltype(p[0], void())
{
p[0] += x;
p[1] += y;
}
translate_point
trabajará con puntos que tienen públicox
yy
miembros, y también funcionará con tuplas / contenedores indexables dondex
yy
están representados por el primer y segundo elemento, respectivamente.
El problema es que otra biblioteca define una clase de punto con publicx
yy
, pero también permite la indexación:
struct StupidPoint
{
int x, y;
int operator[](int i) const
{
if(i == 0) return x;
else if(i == 1) return y;
else throw "you're terrible";
}
};
Mi aplicación, que usa ambas bibliotecas, es la siguiente:
int main(int argc, char **argv)
{
StupidPoint stupid { 8, 3 };
translate_point(stupid, 5, 2);
return EXIT_SUCCESS;
}
pero esto hace que GCC (y clang) sean infelices:
error: call of overloaded ‘translate_point(StupidPoint&, int, int)’ is ambiguous
Ahora puedo ver por qué sucede esto, pero quiero saber cómo solucionarlo (suponiendo que no pueda cambiar las partes internas de StupidPoint) y, si no hay una solución fácil, cómo podría hacerlo como implementador de la biblioteca. lidiar con.