Функции шаблона с несколькими аргументами, ошибки перегрузки и неоднозначности - PullRequest
0 голосов
/ 21 мая 2010

Допустим, я пишу какой-то оператор преобразования и хочу использовать его так:

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.

Есть ли способ сделать это красиво?

1 Ответ

3 голосов
/ 22 мая 2010

Реализуйте тело в шаблоне класса, и тогда вы сможете частично специализироваться:

<pre> template < typename T, typename U > struct convert { static T apply(U const& u) { return T(u); } };</p> <p>template < typename T, typename U > T conv(U const& u) { return convert<T,U>::apply(u); }</p> <p>template < typename T > struct convert<Point<T>, Ipoint> { static Point apply(Ipoint const& u) { return Point(u.x, u.y); } };

Должно работать, но не проверено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...