C++ 操作的条件运算符?

C++ 操作的条件运算符?,c++,C++,有一个条件运算符x?a:b,它通常可以节省大量的写操作 现在我找到了这样一个表达 if ( ( isMax && lower-higher <= distance) || ( !isMax && lower-higher >= distance) ) { ... 其中isMax是一个布尔值,定义了使用最大真值还是最小假值,在这种情况下,下限和上限是int 现在我想知道:有没有一种方法可以这样选择接线员 我的意思不是用x?a:b的

有一个条件运算符x?a:b,它通常可以节省大量的写操作

现在我找到了这样一个表达

   if ( ( isMax && lower-higher <= distance) ||
        ( !isMax && lower-higher >= distance) ) { ...
其中isMax是一个布尔值,定义了使用最大真值还是最小假值,在这种情况下,下限和上限是int

现在我想知道:有没有一种方法可以这样选择接线员

我的意思不是用x?a:b的方法来选择操作数,而是使用不同的运算符

类似bool*op=isMax的东西?运算符=,用于低-高


或者像更低更高的isMax距离,当然不起作用

我不确定三元条件在这里有多大帮助。但是你可以节省一些打字,甚至可以获得一点性能;通过写作来描述它


2*isMax-1*lower-higher我不确定三元条件在这里有多大帮助。但是你可以节省一些打字,甚至可以获得一点性能;通过写作来描述它

2*isMax-1*lower-higher简短回答:否

但有一点很接近,那就是用这种效果编写自己的内联函数:

template<class T>
inline bool compare(bool isLessThan, const T& left, const T& right)
{
    if (isLessThan) {
        return left <= right;
    }
    else {
        return left >= right;
    }
}

// ... later ...
if (compare(isMax, lower - higher, distance)) {
    // ...
}
我的意见,你没有要求:只要使用一个中间变量或几个,如果必要的

简短回答:不

但有一点很接近,那就是用这种效果编写自己的内联函数:

template<class T>
inline bool compare(bool isLessThan, const T& left, const T& right)
{
    if (isLessThan) {
        return left <= right;
    }
    else {
        return left >= right;
    }
}

// ... later ...
if (compare(isMax, lower - higher, distance)) {
    // ...
}
我的意见,你没有要求:只要使用一个中间变量或几个,如果必要的

1:

你应该这么做吗?我个人会使用bool,int,int函数

一开始我有点惊讶,但我猜它不知怎么触发了lambda衰变。如果它们是闭包,并且在[]中有一些内容,则它们将是不同的类型,因此?:的类型将取决于运行时状态

1:

你应该这么做吗?我个人会使用bool,int,int函数


一开始我有点惊讶,但我猜它不知怎么触发了lambda衰变。如果它们是闭包,并且在[]中有一些内容,则它们将是不同的类型,因此?:的类型将取决于运行时状态

如果将运算符封装到具有相同类型的函数中,则可以执行此操作:

namespace detail{
template<class T>
bool less_equal(T lhs, T rhs)
{
    std::cout << "Using <=\n";
    return lhs <= rhs;
}

template<class T>
bool greater_equal(T lhs, T rhs)
{
    std::cout << "Using >=\n";
    return lhs >= rhs;
}
}
然后我们可以把你的逻辑写成:

void DoTheThing(bool isMax, int lower, int higher, int distance)
{
    auto func = isMax ? &detail::less_equal<int> : &detail::greater_equal<int>;
    if (func(lower-higher, distance))
    {
        // your logic here
    }
}
还有一个测试:

int main()
{
    DoTheThing(true, 1, 1, 1); // <=
    DoTheThing(false, 1, 1, 1); // >=
    return 0;
}
输出:

Using <=
Using >=

如果将运算符封装到具有相同类型的函数中,则可以执行此操作:

namespace detail{
template<class T>
bool less_equal(T lhs, T rhs)
{
    std::cout << "Using <=\n";
    return lhs <= rhs;
}

template<class T>
bool greater_equal(T lhs, T rhs)
{
    std::cout << "Using >=\n";
    return lhs >= rhs;
}
}
然后我们可以把你的逻辑写成:

void DoTheThing(bool isMax, int lower, int higher, int distance)
{
    auto func = isMax ? &detail::less_equal<int> : &detail::greater_equal<int>;
    if (func(lower-higher, distance))
    {
        // your logic here
    }
}
还有一个测试:

int main()
{
    DoTheThing(true, 1, 1, 1); // <=
    DoTheThing(false, 1, 1, 1); // >=
    return 0;
}
输出:

Using <=
Using >=

isMax是什么类型的?可能是一个傻瓜在看它是如何使用的。你会吗?isMax&&lower higher=距离功?它有两个独立的求值,基于isMax的布尔值,所以isMax?lower higher=距离这看起来并不是很短。三元数比| |更让人困惑,所以我就不说了。为了响应您的编辑,如果您想选择运算符,通常使用模板参数或函子对象来完成。例如,查看std::priority_队列,通过在模板中传递std::greater作为其比较参数,可以将其从最大堆翻转到最小堆。或者看看std::sort是如何使用比较器的。isMax的类型是什么?可能是一个bool,看看它是如何使用的。你会这样做吗?isMax&&lower higher=距离功?它有两个独立的求值,基于isMax的布尔值,所以isMax?lower higher=距离这看起来并不是很短。三元数比| |更让人困惑,所以我就不说了。为了响应您的编辑,如果您想选择运算符,通常使用模板参数或函子对象来完成。例如,查看std::priority_队列,通过在模板中传递std::greater作为其比较参数,可以将其从最大堆翻转到最小堆。或者看看std::sort是如何使用比较器的。谢谢您的尝试,我理解您在做什么,但这并没有回答我的问题:运算符+1;为了掩埋复杂性;谢谢你的尝试,我理解你在做什么,但这并没有回答我的问题:操作员+1;为了掩埋复杂性;应该命名和存储。考虑将类型声明的比较部分,而不是函数的附加参数。e、 g.请参见中的示例。@Kenny Ostrom isMax是一个运行时值,因此无法在编译时确定比较运算符的选择,这是传递函子所必需的。我只是在想同样的事情,但如果实例化所需的运算符,这并不是一个真正的问题。我怀疑它会在一定范围内得到修复。如果它前后改变,那么这个函数或一个函子对象,正如我刚才在主注释中提到的-策略模式更好。@Kenny Ostrom,但是模板化的函子类型不能用运行时值作为模板参数实例化。在我的想象中,使用函子的唯一方法是将参数传递给选择比较运算符的构造函数,但这会将调用转换为compareFucto
rClass{isMax},lower-higher,distance,这是愚蠢的,因为它增加了复杂性而没有任何好处。@Arthur Tacca,因为我在…之后有几次调用这个比较函数。。。我认为这是最好的阅读方式。多亏了LOT,请考虑将比较部分作为类型声明,而不是函数的附加参数。e、 g.请参见中的示例。@Kenny Ostrom isMax是一个运行时值,因此无法在编译时确定比较运算符的选择,这是传递函子所必需的。我只是在想同样的事情,但如果实例化所需的运算符,这并不是一个真正的问题。我怀疑它会在一定范围内得到修复。如果它前后改变,那么这个函数或一个函子对象,正如我刚才在主注释中提到的-策略模式更好。@Kenny Ostrom,但是模板化的函子类型不能用运行时值作为模板参数实例化。在我的想象中,使用函子的唯一方法是将一个参数传递给它的构造函数,该构造函数选择比较运算符-但这会将调用变成CompareFunctorClass{isMax},更低-更高,距离,这将是愚蠢的,因为它增加了复杂性而没有任何好处。@Arthur Tacca,因为我在…之后有几次调用这个比较函数。。。我认为这是最好的阅读方式。谢谢