What does quot;templatelt;class... Tsgt; struct overloaded : Ts... { using Ts::operator()...; };quot; mean, and how is it being used with std::visit?(模板lt;类有什么功能...TS;结构重载:TS...{Using ts::OPERATOR()...;};quot;Means,以及它如何与std::Access一起使用?) - IT屋-程序员
问题描述
此代码片段摘自https://en.cppreference.com/w/cpp/utility/variant/visit
using var_t = std::variant<int, long, double, std::string>;
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
std::vector<var_t> vec = {10, 15l, 1.5, "hello"};
for (auto& v: vec) {
// 4. another type-matching visitor: a class with 3 overloaded operator()'s
// Note: The `(auto arg)` template operator() will bind to `int` and `long`
// in this case, but in its absence the `(double arg)` operator()
// *will also* bind to `int` and `long` because both are implicitly
// convertible to double. When using this form, care has to be taken
// that implicit conversions are handled correctly.
std::visit(overloaded {
[](auto arg) { std::cout << arg << ' '; },
[](double arg) { std::cout << std::fixed << arg << ' '; },
[](const std::string& arg) { std::cout << std::quoted(arg) << ' '; }
}, v);
}
谁能解释一下using Ts::operator()...;
在这里是什么意思?
在下面的内容中,这个调用的构造函数是什么?使用3个lambda函数?
overloaded {
[](auto arg) { std::cout << arg << ' '; },
[](double arg) { std::cout << std::fixed << arg << ' '; },
[](const std::string& arg) { std::cout << std::quoted(arg) << ' '; }
}
我认为具体的重载实例派生自所有这3个函数类型,然后访问者根据变量的类型选择要使用的正确函数。对吗?
我就是不完全理解这个例子。
推荐答案
它创建一个名为overloaded
的结构模板,该模板继承自其所有模板参数。接下来,它将所有声明的operator()
函数从其基类拉到自己的作用域中,以便当用户对overloaded
结构的实例调用operator()
时,所有这些函数都参与重载解析。
...
使用parameter pack expansion对所有模板参数执行相同的操作。
在下面的内容中,这个调用的构造函数是什么?使用3个lambda函数?
它不是构造函数,它是aggregate initialisation。在本例中,它使用class template argument deduction (CTAD)来推导overloaded
的模板参数并初始化其基类实例。不包括CTAD,聚合初始化与本例相同:
struct A {};
struct B {};
struct C : A, B {};
void f() {
C c{A{}, B{}};
}
实际上,您正在创建overloaded
结构模板的一个实例,使用给定的基类对象直接为其初始化一个对象,并将其传递给std::visit
。最终效果就像您定义了一个具有多个operator()
重载的结构(这是使用std::visit
的正常方式)。
这篇关于模板<;类有什么功能...TS;结构重载:TS...{Using ts::OPERATOR()...;};";Means,以及它如何与std::Access一起使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:模板<;类有什么功能...TS;结构重载:TS...{Using ts::OPERATOR()...;};";Means,以及它如何与std::Access一起使用?
基础教程推荐
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 设计字符串本地化的最佳方法 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01