// comment if you want to see the boost::move issue #define BOOST_THREAD_VERSION 3 #include #include #include #include #include #define WANT_BUILD_TO_FAIL #ifdef WANT_BUILD_TO_FAIL #include #endif class AType { }; class BType { }; typedef boost::shared_ptr IATypePtr; typedef boost::shared_ptr IBTypePtr; typedef boost::variant ABVar; struct ServiceTimeTableEvent { public: ServiceTimeTableEvent(ABVar abType) : m_abType{ abType } {} inline ABVar const& GetABType() const { return m_abType; } inline ABVar & GetABType() { return m_abType; } private: ABVar m_abType; }; class ab_are_equals : public boost::static_visitor { public: template bool operator()(T, U) const { return false; // cannot compare different types } template bool operator()(T lhs, T rhs) const { return lhs == rhs; } }; int main(int argc, char* argv[]) { auto aTypePtr = IATypePtr{ new AType }; auto bTypePtr = IBTypePtr{ new BType }; ABVar aType = aTypePtr; ABVar bType = bTypePtr; ServiceTimeTableEvent timeTableEvent1{ aType }; ServiceTimeTableEvent timeTableEvent2{ bType }; auto xx = boost::apply_visitor(ab_are_equals(), timeTableEvent1.GetABType(), timeTableEvent2.GetABType()); xx = boost::apply_visitor(ab_are_equals(), timeTableEvent1.GetABType(), timeTableEvent1.GetABType());; xx = boost::apply_visitor(ab_are_equals(), timeTableEvent2.GetABType(), timeTableEvent2.GetABType());; }