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.

Respuestas a la pregunta(4)

Su respuesta a la pregunta