我正在使用 "overload" pattern 处理 std::variant
和 std::visit
,如下所示:
#include <iostream>
#include <variant>
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
int main(void) {
std::variant<int, float> var;
auto fs = overloaded {
[](int var) {std::cout << "var is int" << std::endl;},
[](float var) {std::cout << "var is float" << std::endl;}
};
var = 0;
std::visit(fs, var);
var = 0.0f;
std::visit(fs, var);
}
在 cppreference 上,有 an example 说:// explicit deduction guide (not needed as of C++20)
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
为什么在 C++20 中不再需要这个推导指南?删除类型推导指南会导致 compile to fail on all current compilers ,但现在没有人完全支持 C++20,所以这没有任何意义。任何人都可以指出我讨论这个的规范部分吗? 最佳答案
此更改由 P1021R4 添加,特别是 P1816R0 ,它添加了对聚合的类模板参数推导的支持。
具体的措辞可以在 [over.match.class.deduct]/1 中找到,它基本上为聚合添加了一个隐式推导指南:
基本上,您之前必须编写的演绎指南:
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
现在只是脱离了语言。关于c++ - C++20 中的用户定义推导指南,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62868708/