Автоматический вывод типа добавляемого массива - PullRequest
0 голосов
/ 13 февраля 2019

Я довольно новичок в c ++ и пытаюсь создать класс Array в c ++ 17 с использованием шаблонов.В этом классе я перегружаю оператор + таким образом, что он может добавлять массивы нескольких типов.Пока это работает, и я могу добавлять массивы различных типов, например, float и int.Тем не менее, у меня возникли некоторые проблемы с тем, как определить тип нового массива, который является результатом добавления.

Допустим, добавленные мной массивы имеют тип float и int.Тогда новый массив также должен быть плавающим.Однако я не знаю, какой массив имеет тип float, первый или второй, поэтому я не могу создать новый массив с типом T или U.

Кроме того, если из-за совпадения двамассивы с плавающей точкой складываются вместе только в значения 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 голосов
/ 13 февраля 2019

С 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;
}

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...