Я искал в Интернете способ сделать идеальное и эффективное перенаправление (прокси) объекту-члену. Но я не могу найти полезный ресурс. Я полагаю, что это задача, которую программисты часто делают (иногда плохо), и это может быть хорошее знание, чтобы знать хороший, эффективный и лаконичный (минималистский) способ сделать это.C++ совершенная пересылка/прокси инкапсулированного элемента
Я бы хотел, чтобы ваш совет знал, правильно ли я понимаю операции перемещения, и если этот прокси правильно подходит для копирования и перемещения операторов конструктора/присваивания.
Чтобы сделать идеальную переадресацию в операторе присваивания в ходе конструктора/я понимаю, что мы используем std::move
, если мы уверены, что мы передаем lvalue
в инкапсулированном объект и std::forward
иначе. Верно ли это?
Вот мой код
#include <boost/variant.hpp>
/* ********************************************************************/
// Class
/* ********************************************************************/
template <class... T>
class BoostVariantWrapper {
/* ********************************************************************/
// Private fields
/* ********************************************************************/
boost::variant<T...> variant;
public:
/* ********************************************************************/
// Constructors/Destructors
/* ********************************************************************/
BoostVariantWrapper() {}
BoostVariantWrapper(const BoostVariantWrapper &other) :
BoostVariantWrapper(other.variant)
{}
BoostVariantWrapper(BoostVariantWrapper &other) :
BoostVariantWrapper(other.variant)
{}
BoostVariantWrapper(BoostVariantWrapper &&other) :
BoostVariantWrapper(std::move(other.variant))
{}
template<class TOther>
BoostVariantWrapper(TOther &&other) :
variant(std::forward<TOther>(other))
{}
/* ********************************************************************/
// Public methods
/* ********************************************************************/
template <class U>
U& get() {
return boost::get<U>(variant);
}
template <class Fn>
inline void applyVisitor(Fn&& visitor) {
boost::apply_visitor(std::forward<Fn>(visitor), variant);
}
template <class Fn>
inline void applyVisitor(Fn&& visitor) const {
boost::apply_visitor(std::forward<Fn>(visitor), variant);
}
/* ********************************************************************/
// Operators
/* ********************************************************************/
BoostVariantWrapper& operator=(const BoostVariantWrapper &other) {
return operator=(other.variant);
}
BoostVariantWrapper& operator=(BoostVariantWrapper &other) {
return operator=(other.variant);
}
BoostVariantWrapper& operator=(BoostVariantWrapper &&other) {
return operator=(std::move(other.variant));
}
template<class TOther>
BoostVariantWrapper& operator=(TOther &&other) {
variant = std::forward<TOther>(other);
return *this;
}
bool operator==(const BoostVariantWrapper &other) const {
return variant == other.variant;
}
bool operator<(const BoostVariantWrapper &other) const {
return variant < other.variant;
}
friend std::ostream& operator<<(std::ostream &os, const BoostVariantWrapper &x) {
os << x.variant;
return os;
}
/* ********************************************************************/
// Serialization
/* ********************************************************************/
template<class Archive>
void serialize(Archive &ar, const unsigned int) {
ar & variant;
}
};
Edited на основе прим Jarod42
Ужасный комментарий стиль. Наличие огромного комментария 'class' перед определением класса, безусловно, делает код более читаемым! Что касается сути вопроса, я не уверен, о чем вы спрашиваете. Идеальная пересылка и перемещение - это две независимые концепции. – SergeyA
Для рабочего кода может быть более подходящим http://codereview.stackexchange.com/. – Jarod42
Кажется, что некоторые перегрузки не нужны, иначе я не вижу ошибки (отсутствует 'std :: forward' для посетителя btw). – Jarod42