Personal channel of @lancern

Topics: programming, hacking, memes, life, and more. Forward anything as you wish.

Join the discussion group for more fun.

Discord: https://discord.gg/RwUx9et7
P3312: Overload Set Types

目前,如下的代码片段无法编译:
std::vector<float> v = {1, 2, 3, 4};
std::ranges::transform(v, v.begin(), std::sin);


这是因为 std::sin 具有多个重载:
float sin(float);
double sin(double);
long double sin(long double);
template <typename T> double sin(T);


因此在实例化 std::ranges::transform 时类型推导无法得出 std::sin 的类型。

这篇提案建议引入一个全新的 overload-set 类型来解决这个问题。引入这一类型后,表达式 std::sin 即具有 overload-set 类型。overload-set 类型和 closure 类型一样是一个匿名的类型。可以认为 overload-set 类似于一个代理,其内部捕获了在实例化时找到的所有重载的信息,可以使用任意一个重载支持的参数来调用。在上面的例子中,std::ranges::transform 内部在调用传入的 overload-set 对象时会传入一个 float 类型的值,这就相当于调用了接收 float 值的 std::sin 函数重载。

Overload-set 在概念上和 Rust 的 function item type 类似,是纯静态的东西,没有内部状态。每一个对重载函数的使用点都会实例化一个独一无二的 overload-set 类型。
一觉醒来 GitHub 自己禁国区了草
Back to Top