【问题标题】:How do I retrieve a template parameter pack given a std::variant?如何在给定 std::variant 的情况下检索模板参数包?
【发布时间】:2019-12-08 05:11:01
【问题描述】:

示例代码

template<typename T = std::variant<int,double,float>>
void f()
{
}

是否有可能以某种方式检索 std::variant 参数包作为可变参数模板参数(或其他方式)? 我需要获取可以运行折叠表达式的类型列表,因此对于上面的示例,我需要像 typename... Argsint,double,float 这样的东西,我可以运行折叠表达式,给定一个变体(这部分是必不可少的)。 此外,我真的只需要包含类型的类型,而不是这些类型的具体对象。

【问题讨论】:

    标签: c++


    【解决方案1】:

    如果你有这样的功能:

    template<class... Vs>
    void foo( std::variant<Vs...> const& );
    

    您可以将declval&lt;T&gt;() 传递给它以访问模板参数:

    template<typename T = std::variant<int,double,float>>
    void f() {
      using U = decltype(foo(std::declval<T&>()));
    }
    

    然后你可以用Vs...做任何你想做的事情。

    更新:现在我有了更多信息,这里是我的最新示例:

    template<class T = std::variant<int,double,float>>
    void f() {
      print_alternative_types(T{});
    }
    
    template<class... Vs>
    void print_alternative_types( std::variant<Vs...> const& ) {
      (..., (std::cout << typeid(Vs).name() << '\n'));
    }
    

    【讨论】:

    • 请注意,本地 T 在您的示例中是无效的。
    • 该代码给出“错误 C7515 折叠表达式必须包含未展开的参数包”(将 T 传递给折叠表达式)
    • 您可以编辑代码以显示您将如何使用(..., (std::cout &lt;&lt; typeid(T).name())); 吗?因为我试过了,我得到了那个错误
    • std::variant&lt;Vs...&gt; const&amp;&gt; 有一个错字,最后一个 &gt; ,但这有效。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多