Допустим, я пишу какой-то оператор преобразования и хочу использовать его так:
SomeType a;
AnotherType b = conv<AnotherType>(a);
Сначала я пишу базовую (по умолчанию) функцию:
template <typename T, typename U>
inline T conv(const U& a)
{
return T(a);
}
Полная специализация (или не шаблонная перегрузка) не проблема, однако, когда я хочу сделать что-то подобное:
template <typename T>
inline Point<T> conv(const Ipoint& p)
{
return Point<T>(p.x, p.y);
}
Я не могу написать больше функций преобразования из Ipoint (например, в FunkyPoint ) из-за неоднозначности, и я получаю неудобное использование:
Ipoint a;
Point<double> b = conv<double>(a); //ugly!
//Point<double> b = conv<Point<double> >(a); //I want that, but it (obviously) does not compile.
Есть ли способ сделать это красиво?