@Mercury13
Программист на «си с крестами» и не только

Как написать второй operator= в C++?

В дополнение к operator= хочу сделать такой шаблон:
template <class T>
void stealDataFrom(T& to, T& from);

У некоторых простеньких типов этот stealDataFrom очевиден.
class OverrideableInt {
  optional<int> autoValue, overrideValue;  // на самом деле чуть не так, но очень похоже
}

template <>
void stealDataFrom(OverrideableInt& to, OverrideableInt& from) {
  to.overrideValue = from.overrideValue;
  // autoValue не трогаем!
}


Пока нормально. А теперь возьмём какой-нибудь сложный тип.
struct Item {
  OverrideableInt weight, volume, price;
}

Как этому Item’у автоматически прописать stealDataFrom?

Потому я и назвал это «второй operator=»: Си++ напишет op= сам, а мне надо что-то похожее для другой функции.
  • Вопрос задан
  • 208 просмотров
Пригласить эксперта
Ответы на вопрос 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
1. Мне кажется steal не очень удачное название, так как может запутать. В C++ есть присваивание (assignment) где правый аргумент сохраняет значение и перемещение(move) где правый аргумент передает значение левому и теряет собственное (например строка становится пустой).
Ваш код выглядит как assingn. В этом случае правый аргумент from правильнее сделать константным, так как менять его вы не планируете.
void assignDataFrom(OverrideableInt& to, const OverrideableInt& from)

2. >Как этому Item’у автоматически прописать stealDataFrom?
Автоматически генерировать код в C++ пока нельзя. Reflection ожидается в будующих стандартах, но пока он есть только в виде эксперементальных реализаций.
3. Оператор присваивания будет сгенерирован по умолчанию, если не определять его самостоятельно. Он будет использовать операторы присваивания всех нестатических полей класса. Получается для Item сгенерированный по умолчанию оператор сделает то, что вам нужно, если для OverrideableInt он определен правильно.
4. assignDataFrom может использовать этот сгенерированный оператор.
void assignDataFrom(Item& to, const Item& from) {
    to = from;
}

Так вы сможете написать обобщенную шаблонную функцию.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы