模板类内的运算符在该类的不同专业化对象之间的专门化

时间:2017-02-03 15:26:45

标签: c++ templates template-specialization

我有以下问题/疑问: 假设我有一个模板类Couple,它有两个属性x和y,类型为xobject。 我可以很容易地定义同一类的Couple之间的总和,简单地按元素定义sum元素,如果它被定义为模板对象的总和,即:

Couple operator+(Couple in)
{
 return Couple((*this).x+in.x,(*this).y+in.y);
}

通过这种实现,我可以计算Couple<int>元素之间的总和。 我并不完全理解如何定义该类中Couple<int>Couple<something>之间的总和。 问题是我不能在类之间专门化类尚未实现的类,即我不能写

Couple<'int'> Couple<'int'>::operator+(Couple<'something'>)
在夫妻班内。< 你知道怎么做吗?
我的第一个想法是在操作员中使用第二个模板参数,但结果并不是那么好,因为这样做我只允许一节经文而不是两节经文。
我希望我以一种体面的方式解释这个问题。

1 个答案:

答案 0 :(得分:2)

您可以使用friend模板功能:

template <typename T>
class Couple
{
private:
    T x, y;

public:
    Couple(T xx, T xy) : x{xx}, y{xy} { }

    template <typename T0, typename T1>
    friend Couple<std::common_type_t<T0, T1>> 
    operator+(const Couple<T0>& x0, const Couple<T1>& x1);
};

template <typename T0, typename T1>
Couple<std::common_type_t<T0, T1>> 
operator+(const Couple<T0>& x0, const Couple<T1>& x1)
{
    return {x0.x + x1.x, x0.y + x1.y};
}

我正在使用std::common_type_t来计算适合T0 + T1添加的类型。

coliru example

如果您将friendx的getter公开为评论中提及的 SebTu ,则可能不需要y