Como resolver ambiguidade em funções sobrecarregadas usando SFINAE

Eu tenho uma biblioteca incrivelmente interessante que pode traduzir pontos: deve funcionar com qualquer tipo de ponto

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 trabalhará com pontos que têm públicox ey membros e também trabalhará com tuplas / contêineres indexáveis ondex ey são representados pelo primeiro e segundo elemento, respectivamente.

O problema é que outra biblioteca define uma classe de ponto comx ey, mas também permite a indexação:

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";
    }

};

Meu aplicativo, usando as duas bibliotecas, é o seguinte:

int main(int argc, char **argv)
{
    StupidPoint stupid { 8, 3 };
    translate_point(stupid, 5, 2);
    return EXIT_SUCCESS;
}

mas isso deixa o GCC (e o clang) infeliz:

error: call of overloaded ‘translate_point(StupidPoint&, int, int)’ is ambiguous

Agora posso ver por que isso está acontecendo, mas quero saber como consertar isso (supondo que não possa alterar os elementos internos do StupidPoint) e, se não houver uma solução fácil, como eu poderia, como implementador de biblioteca, tornar isso mais fácil lidar com.

questionAnswers(4)

yourAnswerToTheQuestion