假设我正在编写某种转换运算符,我想这样使用它:
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&lt; T&gt;)中再编写转换函数了,最终我的用法很难:
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.
有没有办法做得很好?
答案 0 :(得分:3)
在类模板中实现主体,然后您可以部分专门化:
template < typename T, typename U > struct convert { static T apply(U const& u) { return T(u); } };
template < typename T, typename U > T conv(U const& u) { return convert<T,U>::apply(u); }
template < typename T > struct convert<Point<T>, Ipoint> { static Point apply(Ipoint const& u) { return Point(u.x, u.y); } };
应该有效,但未经测试。