c++ 是否有办法动态更改比较运算符?

zzzyeukh  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(111)

我正在创建一个AI指挥器,需要一种方法来改变AI何时需要给玩家施加压力,何时需要让玩家离开。我有一个对象的TArray,正在检查与玩家的距离。我希望得到最大的距离或最小的距离。
我知道这行不通:

operator comparer = PlayerTensionLevel > BackstageThreshold ? > : <;

在一行Bool中使用的两个变量都是浮点数。我希望这个比较器可以用在以下情况中:

if(DistanceSquared(objectA, objectB) comparer _currentThresholdDistance){
    _currentObject = objectA;
    _currentThresholdDistance = DistanceSquared(objectA, objectB);
}
qco9c6ql

qco9c6ql1#

你可以用bool计算!如果你不关心关系的不同行为,你可以写

if((DistanceSquared(objectA, objectB) > _currentThresholdDistance) ==
   (PlayerTensionLevel > BackstageThreshold)) …

(从技术上讲,这里多余的圆括号是不必要的,但是期望读者知道关系运算符比等式运算符具有更高的优先级可能是不合理的。)

uxhixvfz

uxhixvfz2#

正如@SamVarshavchik在上面的评论中提到的,
您可以使用std::function,并根据PlayerTensionLevelBackstageThreshold将其分配给std::lessstd::greater
确定比较器之后,可以使用它来比较_currentThresholdDistance的当前值和对象之间的平方距离(这里我只是使用dist2来表示它)。

#include <iostream>
#include <functional>

std::function<bool(double a, double b)> 
        GetComp(double PlayerTensionLevel, double BackstageThreshold)
{
    if (PlayerTensionLevel > BackstageThreshold) {
        return std::less<double>{};
    }
    return std::greater<double>{};
}

int main() {
    double _currentThresholdDistance = 1;
    double dist2 = 2;

    double PlayerTensionLevel = 100;
    double BackstageThreshold;

    BackstageThreshold = 101;
    std::cout << GetComp(PlayerTensionLevel, BackstageThreshold)  
                        (dist2, _currentThresholdDistance) << std::endl;

    BackstageThreshold = 99;
    std::cout << GetComp(PlayerTensionLevel, BackstageThreshold)
                        (dist2, _currentThresholdDistance) << std::endl;
}

输出:

1
0

相关问题