Как изменить поведение оператора boost:: option <

Boost:: Вариант определяет оператор <следующим образом:

Если which() == rhs.which(), то: content_this

Это не то, что я хочу, потому что я хотел бы провалить некоторые <сравнения. Например, если у меня есть такой вариант:

typedef boost::variant<int, double, std::string> DataType;

Я хочу, чтобы DataType (1)

Я не могу определить

bool operator < (const Field& lhs, const Field& rhs)

потому что это будет конфликтовать с оператором-членом <определено в варианте класса.

Я могу определить static_visitor, но я хотел бы знать, есть ли способ перегрузить оператор <.

2 ответа

Решение

В то время как упаковкаDataType Внутри другой структуры, безусловно, лучшее решение, имейте в виду, что если вам нужно быстрое и грязное исправление, это работает:

namespace boost
{
template<>
bool DataType::operator<(const DataType &) const
{   
    // impl
}
}

В C++11 вы должны быть в состоянии избежать namespace boost,

Обратите внимание, что это нарушит ODR, если все ваши TU не увидят эту специализацию, прежде чем использовать ее.

Создать struct не содержащий ничего, кроме boost::variant<Ts...> v;, Перешлите ваши конструкторы к нему (возможно, некоторые вручную). Предоставить operator boost::variant<Ts...>() по выбору.

Есть свой < на этом struct,

Обратите внимание, однако, что boost::variant предназначен для нормализации союза. Это должно быть нормально, что некоторые variants одного типа, а некоторые другого типа.

< обычно в std::map Тип контейнера или при сортировке. Принудительное использование ключей одинакового типа или сортировка элементов одинакового типа кажется плохой идеей. variant не должен содержать оба типа, если это не ожидается для любого такого variant содержать оба типа.

Места, где < автоматически используется, все склонны ожидать необязательный объект предиката упорядочения. Лично я не могу понять, почему я когда-либо использую объект предиката, генерирующий исключение, вручную, что заставляет меня опасаться делать ваш по умолчанию.

Другие вопросы по тегам