struct overloaded : Ts... { using Ts::operator()...; };"是什么意思,它如何与 std::visit 一起使用?-6ren"> struct overloaded : Ts... { using Ts::operator()...; };"是什么意思,它如何与 std::visit 一起使用?-这段代码取自https://en.cppreference.com/w/cpp/utility/variant/visit using var_t = std::variant; template s-6ren">
gpt4 book ai didi

c++ - "template struct overloaded : Ts... { using Ts::operator()...; };"是什么意思,它如何与 std::visit 一起使用?

转载 作者:行者123 更新时间:2023-12-03 08:14:20 27 4
gpt4 key购买 nike

这段代码取自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() 函数从其基类拉入自己的作用域,因此当用户在某个对象上调用 operator() 时,这些函数都会参与重载决策。 重载结构的实例。

... 使用parameter pack expansion对所有模板参数执行相同的操作。

And in the following, what constructor is this calling? with the 3 lambda functions?

这不是构造函数,而是 aggregate initialisation 。在本例中,它使用 class template argument deduction (CTAD)推导重载的模板参数并初始化其基类实例。减去 CTAD,聚合初始化与此情况相同:

struct A {};
struct B {};
struct C : A, B {};

void f() {
C c{A{}, B{}};
}

实际上,您正在创建一个重载结构模板的实例,使用给定的基类对象直接为其初始化一个对象,并将其传递给std::visit.最终效果就好像您定义了一个具有多个 operator() 重载的结构(这是使用 std::visit 的正常方式)。

关于c++ - "template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };"是什么意思,它如何与 std::visit 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69915380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com