多参数模板函数,重载和模糊错误

时间:2010-05-21 19:53:00

标签: c++ templates

假设我正在编写某种转换运算符,我想这样使用它:

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.

有没有办法做得很好?

1 个答案:

答案 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); } };

应该有效,但未经测试。