C 11运算符过载,返回类型扣除

我有一个依赖于一种类型的模板类(例如模板< typename T>类Vector).现在,我想重载算术运算符,以便:

>我可以将它们与使用两种不同类型实例化的Vector一起使用;
>结果以与模板实例类型相同的方式推导出来;

例:

Vector<float> fv = {1.5, 2.5};
Vector<int> iv = {1,2};
auto s1 = fv + iv;   // s1 MUST be of type Vector<float> == {2.5, 4.5}
auto s2 = iv + fv;   // s2 MUST be of type Vector<float> == {2.5, 4.5}

我认为,在实现矩阵,向量,多项式等的通用目的数学库中,这将是一个在可用性方面产生差异的特性.

我找到了三种用C 11获得这个结果的方法

> – >符号

template <typename T, typename U>
auto operator +(const Vector<T> &lhs, const Vector<U> &rhs)
    -> Vector<decltype(lhs[0]+rhs[0])>
{
    Vector<decltype(lhs[0]+rhs[0])> res(lhs);
    res += rhs;
    return res;
}

> declval

template <typename T, typename U> 
Vector<decltype(std::declval<T>()+std::declval<U>())> 
operator +(const Vector<T> &lhs, const Vector<U> &rhs)
{
    Vector<decltype(lhs[0]+rhs[0])> res(lhs);
    res += rhs;
    return res;
}

> declval作为默认类型arg

template <typename T, typename U, 
          typename R = decltype(std::declval<T>()+std::declval<U>())> 
Vector<R> operator +(const Vector<T> &lhs, const Vector<U> &rhs)
{
    Vector<R> res(lhs);
    res += rhs;
    return res;
}

在您看来,实现此类功能的最佳方法是什么?
如果有更好的解决方案,我会很感激.

您是否认为这种“互通”操作符是一项有价值的功能?

谢谢和最诚挚的问候,
达维德

最佳答案 这些操作符是否是一个“好主意”取决于您的用例.但是如果你想实现它们,我建议你使用一个从std :: common_type派生的traits类来获得更多控制:

template<typename T, typename U>
struct VectorCommonType : std::common_type<T,U> {};

template<typename T, typename U>
using VectorCommonTypeT = Vector<typename VectorCommonType<T,U>::type>;

这样你(或类的用户)可以在需要时专门化它.像这样使用它:

template<typename T, typename U> 
VectorCommonTypeT<T,U> operator+(const Vector<T> &lhs, const Vector<U> &rhs)
{
    VectorCommonTypeT<T,U> res(lhs);
    res += rhs;
    return res;
}
点赞