2017-02-01 2 views
0

Я искал в Интернете способ сделать идеальное и эффективное перенаправление (прокси) объекту-члену. Но я не могу найти полезный ресурс. Я полагаю, что это задача, которую программисты часто делают (иногда плохо), и это может быть хорошее знание, чтобы знать хороший, эффективный и лаконичный (минималистский) способ сделать это.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

+0

Ужасный комментарий стиль. Наличие огромного комментария 'class' перед определением класса, безусловно, делает код более читаемым! Что касается сути вопроса, я не уверен, о чем вы спрашиваете. Идеальная пересылка и перемещение - это две независимые концепции. – SergeyA

+0

Для рабочего кода может быть более подходящим http://codereview.stackexchange.com/. – Jarod42

+0

Кажется, что некоторые перегрузки не нужны, иначе я не вижу ошибки (отсутствует 'std :: forward' для посетителя btw). – Jarod42

ответ

0

станд :: вперед само по себе делает идеальный переадресацию. Он предназначен для этой цели.

Смежные вопросы