【发布时间】:2022-06-10 20:06:32
【问题描述】:
有人可以简单解释一下我在学习 C++ 17 std::visit 时发现的以下模板代码语法。
#include <iostream>
#include <string>
#include <variant>
template<typename... Targs>
struct VariantType : Targs... {
using Targs::operator()...;
};
template<typename... Targs>
VariantType(Targs...) -> VariantType<Targs...>;
int main() {
std::variant<int, double, std::string> var;
var = "Hello, world!";
std::visit(
VariantType {
[] (int i) { std::cout << "int: " << i << std::endl; },
[] (double d) { std::cout << "double: " << d << std::endl; },
[] (const std::string& str) { std::cout << "std::string: " << str << std::endl; }
}, var
);
}
【问题讨论】:
-
你问的是哪位?这段代码中的所有东西都有欺骗目标。
-
@NathanOliver
main函数之外的模板代码。我从来没有见过这样的语法,我不明白那部分发生了什么。 -
你的意思是
template<typename... Targs> VariantType(Targs...) -> VariantType<Targs...>;,这是一个演绎指南(en.cppreference.com/w/cpp/language/…)还是main之外的所有其他内容? -
你知道variadic pack 是什么吗?
Targs是一个可变参数包。那么template ... -> ...就是一个推演指南。 -
我刚刚添加的第二个欺骗目标将为您分解整个事情。