Как сравнить boost:: variant, чтобы сделать его ключом std:: map?

Как сравнить boost:: variant, чтобы сделать его ключом std:: map? Кажется, что оператор <() не определен для boost:: variant

2 ответа

ИЗМЕНИТЬ ОШИБКУ, ЗАЯВЛЯЮЩУЮ BOOST: APPLY_VISITOR

Вы можете создать двоичного посетителя для своего варианта, а затем использовать boost:: apply_visitor для создания компаратора для вашей карты:

class variant_less_than
 : public boost::static_visitor<bool>
{
public:
 template <typename t,="" typename="" u="">
 bool operator()( const T & lhs, const U & rhs ) const
 {
 // compare different types
 }
 template <typename t="">
 bool operator()( const T & lhs, const T & rhs ) const
 {
 // compare types that are the same
 }
};
</typename></typename></bool>

Вам, вероятно, придется перегружать operator() для каждой возможной пары типов, как это указано в использовании шаблона operator(const T &, const U &). Затем вам нужно объявить свою карту следующим образом:

class real_less_than
{
public:
 template<typename t="">
 bool operator()(const T &lhs, const T &rhs)
 {
 return boost::apply_visitor(variant_less_than(), lhs, rhs);
 }
};
std::map<boost::variant<t, u,="" v="">, ValueType, real_less_than> myMap;
</boost::variant<t,></typename>

Изменить: для чего он стоит operator<() для boost::variant, но он определен как:

bool operator<(const variant &rhs) const
{
 if(which() == rhs.which())
 // compare contents
 else
 return which() < rhs.which();
}

который я предполагаю, не то, что вы хотите.


Возможно, вы можете передать компаратор к карте. См. http://www.sgi.com/tech/stl/Map.html для примера о том, как писать компаратор.

licensed under cc by-sa 3.0 with attribution.