P3312: Overload Set Types
目前,如下的代码片段无法编译:
这是因为
因此在实例化
这篇提案建议引入一个全新的 overload-set 类型来解决这个问题。引入这一类型后,表达式
Overload-set 在概念上和 Rust 的 function item type 类似,是纯静态的东西,没有内部状态。每一个对重载函数的使用点都会实例化一个独一无二的 overload-set 类型。
目前,如下的代码片段无法编译:
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 类型。