我正在阅读 Nicolai M. Josuttis 的《C++17 - 完整指南》一书。
第 14 章的标题是“使用可变参数声明”。我不明白其中的示例代码:
// 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 ?? -> see answer from Ted Lyngmo
// EDIT: That's also based on the fact that overload can use
// aggregate initialization, and so that overload can be
// instancied with a constructor with any number and types
// (but we have to help it to deduce the types).
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 部分:我们使用聚合初始化来初始化基类函数调用运算符。
如果我必须再次阅读前面的章节,请告诉我哪一章!
这是一个用户定义的推导指南
overload
。它将在类模板实例化时使用,而无需明确指定任何模板参数。然后它有助于推断该类为overload<Ts...>
。在此背景下:
...它构成
twice
类型在 C++20 中,隐式生成的推理指南就足够了,但在 C++17 中,这种类型的实例化需要这种推理指南。