自动推断添加数组的类型

时间:2019-02-13 09:04:45

标签: c++ templates operator-overloading

我对c ++还是很陌生,我尝试使用模板在c ++ 17中创建一个Array类。在此类中,我以使它可以添加多种类型的数组的方式重载了+运算符。到目前为止,它确实有效,我能够添加不同的数组,例如float和int类型一起。但是,我在如何定义新数组的类型时遇到了麻烦,这是添加的结果。

假设我添加的数组是float和int类型。然后,新数组也应为float。但是,就我而言,我不知道哪个数组具有浮点类型,第一个或第二个,因此我无法创建类型为T或U的新数组。

此外,如果由于巧合,两个float数组加在一起仅是int值(例如1.5 + 3.5 = 5(int)),则新数组应为int类型。

基本上,我尝试根据添加后内容的类型来定义新数组的类型。

我遇到了一些包含decltype的解决方案。但是,由于数组具有多个值,因此我无法设法找到如何将其包含在多个值中的方法。在我当前的代码中,我基于类型T创建新数组。但是,如果在某种情况下T为int类型,U为float类型,则结果不正确。

任何建议或技巧都将不胜感激。 预先感谢,

template <typename T>
class Array {
 public:
  T* content;
  int length;

  // Default Constructor
  Array() : content(nullptr), length(0) {}

  // Constructor when length is provided
  Array(int length) : content(new T[length]), length(length) {}

  // Constructor (using initializer list)
  Array(std::initializer_list<T> list) : Array((int)list.size()) {
    std::uninitialized_copy(list.begin(), list.end(), content);
  }

  // Obtain content at index i
  float& operator[](int i) { return content[i]; }

  // Adding arrays
  template <typename U>
  Array& operator+(Array<U>& other) {
    Array<T>* new_array = new Array(other.length);

    for (auto i = 0; i < other.length; i++)
      new_array->content[i] = this->content[i] + other.content[i];

    return *new_array;
  }
};

1 个答案:

答案 0 :(得分:1)

使用decltype,您的operator +可能如下所示:

template<typename U>
auto operator+(const Array<U>& rhs)
-> Array<std::decay_t<decltype((*this)[0] + rhs[0])>>
{
    Array<std::decay_t<decltype((*this)[0] + rhs[0])>> res(rhs.length);

    for (auto i = 0; i != rhs.length; i++) {
        res[i] = (*this)[i] + rhs[i];
    }
    return res;
}

Demo