Оператор перегрузки = для членов структуры класса std :: vector <> - PullRequest
0 голосов
/ 15 января 2019

Скажем, у меня есть следующая структура:

struct Parameter {
  double value;
  double error;
};

Так что я обычно работаю с векторами этой структуры (т.е. std::vector<Parameter>), и иногда я хочу установить вектор из значений (но не ошибок ) в этом векторе параметров, для удобства используйте operator= со стандартным std :: vector.

std::vector<Parameter> vector_of_parameters;
std::vector<double> vector_of values;
....
vector_of_parameters = vector_of_values;

Для этого я пытаюсь перегрузить operator= для этой структуры следующим образом:

std::vector<Parameter> operator=(const std::vector<double>& v) {
  this->clear();
  for (const auto& i:v) {
    Parameter p;
    p.value = i;
    this->push_back(p);
  }
  return *this;
}

Но это вернет ошибку, говорящую о том, что оператор std :: vector = (const std :: vector & v) должен быть нестатическим членом . Поэтому, если я правильно понимаю, я должен определить это как функцию-член оператора как:

std::vector<Parameter>::operator=(const std::vector<double>& v) {
  this->clear();
  for (const auto& i:v) {
    Parameter p;
    p.value = i;
    this->push_back(p);
  }
  return *this;
}

Теперь ошибка говорит о том, что синтаксис с шаблоном <> , но я его не вижу или не понимаю, и не знаю, что еще я могу сделать.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я думаю, что альтернативным простым способом создания std::vector<Parameter> из std::vector<double> является определение конструктора с одним аргументом Parameter(double value), который принимает Parameter::value:

#include <vector>
#include <optional>

struct Parameter
{  
    double value;
    std::optional<double> error;

    explicit Parameter(double v) : value(v)
    {}
};

Тогда вы можете использовать range-constructor следующим образом:

DEMO

std::vector<Parameter> v_of_parameters(v_of_values.cbegin(), v_of_values.cend());
0 голосов
/ 15 января 2019

Вы не можете перегрузить оператор присваивания std::vector. operator = должна быть функцией-членом, и вы просто не можете добавить функцию-член к std::vector.

Что вы можете сделать, так это создать вспомогательную функцию, например create_parameters, которая принимает std::vector<double> и возвращает std::vector<Parameter>. Это будет выглядеть как

std::vector<Parameter> create_parameters(std::vector<double> const& params)
{
    std::vector<Parameter> ret(params.size());
    std::transform(params.begin(), params.end(), ret.begin(),
                   [](auto value) { return Parameter{value, 0}; });
    return ret;
}

, а затем

vector_of_parameters = vector_of_values;

станет

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