c++ - 不同版本模板类的二元运算符

标签 c++ templates operators

我有模板类 Point2D,我需要为不同版本的模板类实现二元运算符。由于 operator+ 的问题,此代码无法编译

template <class T>
class Point2D
{
public:
    T x;
    T y;
    Point2D(T _x=0,T _y=0):x(_x),y(_y)
    {
    }
    Point2D(Point2D& ob)
    {
        x=ob.x;
        y=ob.y;
    }
    template <class T1>
    Point2D(Point2D<T1>& ob)
    {
        x=ob.x;
        y=ob.y;
    }
};
template <class T>
Point2D<T> operator+(const Point2D<T>& ob1,const Point2D<T>& ob2)
{
    return Point2D<T>(ob1.x+ob2.x,ob1.y+ob2.y);
}
int main()
{
    Point2D<int> ob1(10,10);
    Point2D<double> ob2(20,20);
    Point2D<double> ob3=ob2+ob1;
    return 0;
}

我想启用这样的功能Point2D<double> ob3=ob2+ob1;但编译器无法推断出此运算符的正确版本 Point2D<T> operator+(const Point2D<T>& ob1,const Point2D<T>& ob2) 我应该改变什么才能让它发挥作用?

最佳答案

使用两个模板参数:

template <class T1, class T2>
Point2D<T1> operator+(const Point2D<T1>& ob1,const Point2D<T2>& ob2)
{
    return Point2D<T1>(ob1.x+ob2.x,ob1.y+ob2.y);
}

这是使编译器满意的最小更改。

但是,如您所见,结果的类型是使用 T1 作为模板参数类型实例化的,这可能是不可取的。因此,您需要选择最适合您工作的类型。这涉及某种元编程。

在 C++11 中,它非常简单,带有尾随返回类型:

template <class T1, class T2>
auto operator+(const Point2D<T1>& ob1,const Point2D<T2>& ob2) -> Point2D<decltype(obj1.x+obj2.x)>
{
    typedef decltype(obj1.x+obj2.x) R;
    return Point2D<R>(ob1.x+ob2.x,ob1.y+ob2.y);
}

在此处熟悉尾随返回类型:

关于c++ - 不同版本模板类的二元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8464671/

相关文章:

c++ - 在 switch 案例中实现函数调用的其他方式

mysql - = 和 := in MySQL? 有什么区别

angular - 如何将一种类型的 Observable 转换为另一种类型的 Observable

c++ - 理解 std::function 和 std::bind

c++ - C++ 编译器可以缓存 constexpr 函数的结果吗?

c++ - 在类初始化和初始化列表中

c++ - 模板元编程 - 我还是不明白 :(

c++ - 在 ubuntu 14.04 LTS 上编译 fileZilla

c++ - 是否可以使用参数包而不是嵌套模板序列?

c++ - 谁能给我一个 operator= of vector in MSDN 的链接?