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.