Как устранить неоднозначность в перегруженных функциях с помощью SFINAE

У меня есть невероятно захватывающая библиотека, которая может переводить точки: она должна работать с любыми типами точек

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 будет работать с точками, которые имеют публичныеx а такжеy члены, и он также будет работать с кортежами / индексируемыми контейнерами, гдеx а такжеy представлены первым и вторым элементом соответственно.

Проблема в том, что другая библиотека определяет класс точек с открытымx а такжеy, но также позволяет индексировать:

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

};

Мое приложение, использующее обе библиотеки, выглядит следующим образом:

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

но это делает GCC (и лязг) несчастным:

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

Теперь я понимаю, почему это происходит, но я хочу знать, как это исправить (при условии, что я не могу изменить внутреннюю часть StupidPoint), и, если нет простого обходного пути, как я мог бы, как разработчик библиотеки, сделать это проще иметь дело с.

Ответы на вопрос(4)

Ваш ответ на вопрос