c++ - 为什么 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++20 引入了一个非通用的函数/算法有充分的理由吗?
为一小组类型实现它可以在混合不同的参数类型和处理可能的隐式转换(更不用说模棱两可的重载)时更容易确保正确的结果。正如cppreference (可能是模板)上的最后一个重载所指定的,调整类型以尽可能少地丢失精度。
当类型列表是开放式的时,如何实现相同的目标?客户端程序员将他们想要的任何含义注入重载的运算符?我会说这几乎是不可能的。
它并不是什么新鲜事,std::pow
例如,它在 C++11 中添加了类似的重载。处理数字数据的标准库实用程序总是只为实现知道的类型指定。
如果lerp
对您的自定义类型有意义,那么您可以将重载添加到您的自定义命名空间中。ADL 会找到它,以及构建在它之上的通用代码
using std::lerp;
lerp(arg1, arg2, arg3);
也可以为您的自定义类型工作。
推荐阅读
- android - YouTube 数据 API v3 - 如何处理 youtubeSignupRequired 错误
- puppeteer - Puppeteer:截图懒惰的图像不起作用
- c++ - 三角形纹理水平旋转和翻转
- phpexcel - phpexcel中的除法不起作用(公式)
- google-bigquery - 通过控制台 UI 将 CSV 文件上传到 BigQuery 时收到“读取数据时出错”错误
- java - java8不止一次检查可选的空值
- events - AttributeError:“事件”对象没有属性“mouse_pos”
- c++ - 为什么我的 fltk 程序编译但不运行?
- erlang - 添加插件后 EMQ 启动时出现错误:您尝试设置 XXX,但没有设置该名称
- express-validator - express-validator 错误检查