У меня есть невероятно интересная библиотека, которая умеет переводить точки: она должна работать с любыми типами точек.
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 (и clang) несчастным:
error: call of overloaded ‘translate_point(StupidPoint&, int, int)’ is ambiguous
Теперь я понимаю, почему это происходит, но я хочу знать, как это исправить (при условии, что я не могу изменить внутренности StupidPoint), и, если нет простого обходного пути, как я, как разработчик библиотеки, могу упростить это. иметь дело с.
operator[]
также имеет неконстантную перегрузку, возвращающуюint&
, которую я пропустил в своем простом тестовом примере. - person jaymmer - Reinstate Monica   schedule 10.07.2016