首页 > 解决方案 > 为什么 std::lerp 不适用于已实现所需操作的任何类型?

问题描述

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

标签: c++c++20linear-interpolation

解决方案


C++20 引入了一个非通用的函数/算法有充分的理由吗?

为一小组类型实现它可以在混合不同的参数类型和处理可能的隐式转换(更不用说模棱两可的重载)时更容易确保正确的结果。正如cppreference (可能是模板)上的最后一个重载所指定的,调整类型以尽可能少地丢失精度。

当类型列表是开放式的时,如何实现相同的目标?客户端程序员将他们想要的任何含义注入重载的运算符?我会说这几乎是不可能的。

它并不是什么新鲜事,std::pow例如,它在 C++11 中添加了类似的重载。处理数字数据的标准库实用程序总是只为实现知道的类型指定。

如果lerp对您的自定义类型有意义,那么您可以将重载添加到您的自定义命名空间中。ADL 会找到它,以及构建在它之上的通用代码

using std::lerp;
lerp(arg1, arg2, arg3);

也可以为您的自定义类型工作。


推荐阅读