gpt4 book ai didi

c++ - 为什么 std::lerp 不适用于任何已实现所需操作的类型?

转载 作者:行者123 更新时间:2023-12-05 09:09:07 29 4
gpt4 key购买 nike

在学习了 std::lerp 之后,我尝试将它与强类型一起使用,但它失败了,因为它只适用于内置类型......

#include <iostream>
#include <cmath>

struct MyFloat{

float val = 4.7;
MyFloat operator *(MyFloat other){
return MyFloat(other.val*val);
}
MyFloat operator +(MyFloat other){
return MyFloat(other.val+val);
}
MyFloat operator -(MyFloat other){
return MyFloat(other.val-val);
}
};
int main()
{
MyFloat a{1}, b{10};
//std::lerp(a, b, MyFloat{0.3}); :(
std::lerp(a.val, b.val, 0.3f);
}

我的问题是:C++20 引入非泛型的函数/算法是否有充分的理由?

最佳答案

std::lerp 不可能为碰巧提供一些算术运算符的任意类型提供关于数值行为 的保证。 (库无法检测到您的示例只是将它们转发到内置的 float 版本。)

虽然可以对参数类型施加要求以允许正确的实现,但它们需要非常详细才能使 MyFloat以与 float 相同的性能和结果处理。例如,实现可能需要比较参数类型的值(您的类型不支持!)并且可以利用浮点值之间的间距t=1 附近提供单调性保证。

由于这些保证是函数的全部要点(朴素的公式是微不足道的),因此它根本没有以通用形式提供。

关于c++ - 为什么 std::lerp 不适用于任何已实现所需操作的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62654018/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com