小题大做!
一般的写法
template <typename T>
T add(T x, T y)
{
return x+y;
}
此做法无法完成俩不同类型的操作
换个方法:
template <typename P1, typename P2>
P1 add(const P1& p1, const P2& p2)
{
return p1+p2;
}
万一要返回P2呢,所以还的增加返回P2的版本:
template <typename P1, typename P2>
P2 add(const P1& p1, const P2& p2)
{
return p1+p2;
}
现在看起来是完整了,可是实际会出现错误,因为仅凭返回类型不同是不可以分辨出应该调用
那一个版本的,会出现二义性,所以把返回类型改成一个template class:
template <typename P1, typename P2>
AddT<P1, P2> add(P1 x, P2 y)
{
return AddT<P1, P2>(x,y);
}
template <typename P1, typename P2>
class AddT
{
public:
AddT(const P1& p1, const P2& p2)
: m_p1(p1), m_p2(p2) {}
operator P1()
{return m_p1 + (P1)m_p2;}
operator P2()
{return (P2)m_p1 + m_p2;}
private:
const P1& m_p1;
const P2& m_p2;
};
然而为了应对P1和P2是相同的类型时,需要偏特化引入以完美解决这个小题大做的问题
template <typename P1>
class AddT<P1, P1>
{
public:
AddT(P1 p1, P1 p2)
: m_p1(p1), m_p2(p2) {}
operator P1()
{return m_p1 + (P1)m_p2;}
private:
const P1 &m_p1, &m_p2;
};