gpt4 book ai didi

具有返回类型推导的 C++ 11 运算符重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:42 24 4
gpt4 key购买 nike

<分区>

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

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

例子:

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}

我认为,在实现矩阵、 vector 、多项式等的通用数学库中,这将是一个在可用性方面有所不同的功能。

我发现了三种使用 C++11 获得此结果的方法

  1. ->符号

    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;
    }
  2. 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;
    }
  3. 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;
    }

在您看来,实现此类功能的最佳方法是什么?如果有第四个更好的解决方案,我将不胜感激。

您认为这种“互通”运算符是一项有值(value)的功能吗?

谢谢和最好的问候,大卫

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com