覆盖 std::variant 中双精度值的比较运算符

问题描述 投票:0回答:1

我有一个类方法,可以根据当前选择的关系来比较

std::variant

bool Result = false;
auto CachedValue = ...;         // std::variant<std::wstring, double, int>
const auto& FirstValue = ...;   // std::variant<std::wstring, double, int>
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;
    case RELATION::LT: Result = (CachedValue <  FirstValue); break;
    case RELATION::GE: Result = (CachedValue >= FirstValue); break;
    . . . . .
    }
}
return Result;

但是,我想对变体中包含的双精度值使用“基于 epsilon”的比较。但我实现这一点的所有尝试都会导致代码大小成倍增加并丧失可读性。有没有办法在 C++ 17 中紧凑地实现这一点?

c++17
1个回答
0
投票

我建议你将

m_Relation
改为函数指针:

using var_type = std::variant<std::wstring, double, int>;

bool (*m_Relation)(const var_type& lhs, const var_type & rhs);

这样你只需提供正确的函子即可使用:

m_Relation = [](const var_type& lhs, const var_type & rhs) -> bool {
    // compare and return result
};

您的

switch
可以替换为简单的函数调用:

if (auto ValIndex = CachedValue.index(); ValIndex == FirstValue.index())
{
    Result = m_Relation(CachedValue, FirstValue);
    //...
}
© www.soinside.com 2019 - 2024. All rights reserved.