求两数和

小题大做!

一般的写法

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;
};

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页