需要帮助理解可变参数“使用”声明

问题描述 投票:0回答:1

我正在阅读 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 部分:我们使用聚合初始化来初始化基类函数调用运算符。

如果我必须再次阅读之前的章节,请告诉我是哪一章!

c++ c++17 variadic-templates
1个回答
2
投票
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 中,此类实例化需要此推导指南。

© www.soinside.com 2019 - 2024. All rights reserved.