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

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 引入非通用函数/算法有充分的理由吗?

Dav*_*ing 5

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

\n

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

\n

由于这些保证是函数的全部要点(na\xc3\xafve 公式很简单),因此根本不以通用形式提供 it\xe2\x80\x99。

\n