我正在阅读 Nicolai M. Josuttis 所著的《C++17 - 完整指南》一书。
第 14 章的标题是“使用可变参数 using 声明”。我不明白其中的示例代码:
// Part 1: "inherit" all function call operators of passed based types:
template<typename... Ts>
struct overload : Ts...
{
using Ts::operator()...;
}
// Part 2: base types are deduced from passed arguments
// >>>> What is it ??
template<typename... Ts>
overload(Ts...) -> overload<Ts...>;
// Part 3
auto twice = overload {
[](std::string& s) { s += s; }
[](auto& v) { v *= 2; }
};
代码由 3 部分组成:
第 1 部分:我知道我们声明了一个类,该类最终将有 3 个函数调用运算符。
第 2 部分:我不明白这个... - 我们在这里声明什么?你能解释一下语法吗,特别是
overload(Ts...)
?
第 3 部分:我们使用聚合初始化来初始化基类函数调用运算符。
如果我必须再次阅读之前的章节,请告诉我是哪一章!
template<typename... Ts> overload(Ts...) -> overload<Ts...>;
我们在这里宣布什么?
这是自定义推演指南。当类模板
overload
被实例化而没有显式指定 any 模板参数时,将会使用它。然后它有助于推断类别为 overload<Ts...>
。
在此背景下:
auto twice = overload {
[](std::string& s) { s += s; },
[](auto& v) { v *= 2; }
};
...它使
twice
成为类型
overload<decltype(lambda1), decltype(lambda2)>
在 C++20 中,隐式生成的推导指南就足够了,但在 C++17 中,此类实例化需要此推导指南。