【问题标题】:variadic template code syntax of std::visit [duplicate]std::visit 的可变参数模板代码语法 [重复]
【发布时间】: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&lt;typename... Targs&gt; VariantType(Targs...) -&gt; VariantType&lt;Targs...&gt;;,这是一个演绎指南(en.cppreference.com/w/cpp/language/…)还是main之外的所有其他内容?
  • 你知道variadic pack 是什么吗? Targs 是一个可变参数包。那么template ... -&gt; ...就是一个推演指南。
  • 我刚刚添加的第二个欺骗目标将为您分解整个事情。

标签: c++ c++17


猜你喜欢
  • 2018-02-24
  • 1970-01-01
  • 2015-08-24
  • 2019-02-04
  • 2012-11-05
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
相关资源
最近更新 更多