Переопределение операторов сравнения для двойных значений в std::variantC++

Программы на C++. Форум разработчиков
Anonymous
 Переопределение операторов сравнения для двойных значений в std::variant

Сообщение Anonymous »

У меня есть метод класса, который сравнивает std::variant в соответствии с выбранным в данный момент отношением:

Код: Выделить всё

bool Result = false;
auto CachedValue = ...;         // std::variant
const auto& FirstValue = ...;   // std::variant
if (auto ValIndex = CachedValue.index(); ValIndex == FirstValue.index())
{
switch (m_Relation)
{
case RELATION::EQ: Result = (CachedValue == FirstValue); break;
case RELATION::NE: Result = (CachedValue != FirstValue); break;
case RELATION::GT: Result = (CachedValue >  FirstValue); break;
case RELATION::LE: Result = (CachedValue = FirstValue); break;
. . . . .
}
}
return Result;
Однако я хотел бы использовать сравнение «на основе эпсилона» для двойных значений, содержащихся внутри вариантов. Но все мои попытки это реализовать приводят к многократному увеличению размера кода и потере читабельности. Есть ли способ компактно реализовать это на C++ 17?
Во-первых, моя задача не имеет ничего общего с численными расчетами; в противном случае использование std::variant будет неуместным. Во-вторых, у меня есть математическое образование, и я полностью осведомлен об элементарных свойствах равенства и порядка. И в-третьих, я не спрашиваю, как сравнивать значения с плавающей запятой. Я спрашиваю о том, что кажется мне интересным упражнением по программированию: как переопределить стандартное сравнение типов POD, составляющих std::variant, без слишком большого увеличения размера кода и потери читабельности?
Редактировать: Что касается опасений, что то, как я сформулировал проблему, нарушает элементарные свойства равенства и порядка, поверьте мне, я знаю, что делаю. Код, сравнивающий std::variants, должен вызываться моим приложением только в том случае, если варианты содержат один и тот же тип (один и тот же индекс()). Если это не так, то все поведение приложения ужасно неправильное и его следует прервать.
Наверное, чтобы подчеркнуть этот момент, было бы лучше выбросить, когда типы сравниваемого варианта не одно и то же, а не отношение "мусор на входе - мусор на выходе".

Подробнее здесь: https://stackoverflow.com/questions/790 ... stdvariant

Вернуться в «C++»