求两数和

10 篇文章 0 订阅

小题大做!

一般的写法

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值