NoS*_*tAl 2 c++ linear-interpolation c++20
在了解 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);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:C++20 引入非通用函数/算法有充分的理由吗?
对于恰好提供一些算术运算符的任意类型,不可能提供其数值行为std::lerp的保证。(\xe2\x80\x99s 库无法检测到您的示例只是将它们转发到内置版本。)float
虽然可以对参数类型施加要求以允许正确的实现,但它们需要非常详细才能MyFloat以与 相同的性能和结果进行处理float。例如,实现可能需要比较参数类型的值(您的类型不支持\xe2\x80\x99t!),并且可以利用浮点值之间的间距来提供接近t =1 的单调性保证。
由于这些保证是函数的全部要点(na\xc3\xafve 公式很简单),因此根本不以通用形式提供 it\xe2\x80\x99。
\n