class TuneResult { private: std::string m_name; std::map<std::pair<double, double>, double> m_measurements; std::pair<double, double> m_optimum; std::vector<std::string> m_logMessages; };
Without pimpl, adding a move constructor requires a bit of effort:
class TuneResult { TuneResult(TuneResult&& other) : m_name(std::move(other.m_name)) , m_measurements(std::move(other.m_measurements)) , m_optimum(std::move(other.m_optimum)) , m_logMessages(std::move(other.m_logMessages)) { } private: std::string m_name; std::map<std::pair<double, double>, double> m_measurements; std::pair<double, double> m_optimum; std::vector<std::string> m_logMessages; };
It's not hard to imagine that becoming much longer for classes with more members. But if you've already pimpled anyway, moving becomes trivial:
// h file class TuneResultImpl; class TuneResult { TuneResult(TuneResult&& other); private: friend class TuneResultImpl; std::unique_ptr<TuneResultImpl> m_impl; }; // cpp file class TuneResultImpl { friend class TuneResult; private: TuneResult* m_self; std::string m_name; std::map<std::pair<double, double>, double> m_measurements; std::pair<double, double> m_optimum; std::vector<std::string> m_logMessages; }; TuneResult::TuneResult(TuneResult&& other) : m_impl(std::move(other.m_impl)) { m_impl->m_self = this; // don't forget! }
No comments:
Post a Comment