C++17,制作一个使用依赖于模板参数的 std::variant 的可变参数模板?

Posted

技术标签:

【中文标题】C++17,制作一个使用依赖于模板参数的 std::variant 的可变参数模板?【英文标题】:C++17, making a variadic template that uses an std::variant that is dependant on template params? 【发布时间】:2019-10-28 20:59:32 【问题描述】:

有没有办法在 C++17 中指定一个变体,其中变体中的每个条目都已从可变参数模板以某种重复的方式修改?

特别是,我想声明一个可能看起来像这样的模板,声明一个std::variant 成员,类似于:

template<typename... Args> class Contains 
      ...
    std::variant<...> choices;
      ...

例如,Contains&lt;Type1, Type2, Type3,....&gt;choices 成员将是std::variant&lt;const Type1 *, const Type2 *, const Type3 *, ....&gt;。其中提供的类型可能不一定共享一个公共基类。也就是说,每个提供给模板的类型都成为 std::variant 中的一个 const 指针。

我知道我可以手动将传递给模板的每个条目直接指定为必要的指针类型,我想知道是否有某种方法可以使用可变参数模板使声明更容易输入,只使用基本类型的名称对于Contains 模板?

【问题讨论】:

std::variant&lt;const Args*...&gt; 【参考方案1】:

简单地做:

template <typename... Args>
class Contains

    std::variant<const Args*...> choices;
;

【讨论】:

【参考方案2】:

只需为Contains 类中的choices 声明提供带有const 修饰符的相同类型。

template <typename... Args>
class Contains
  
    std::variant<const Args*...> choices;
  ;

【讨论】:

以上是关于C++17,制作一个使用依赖于模板参数的 std::variant 的可变参数模板?的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::async 时 C++“无法推断模板参数”

具有 std::array 大小类型的派生模板类

如何对可变参数函数中的所有参数调用 std::forward ?

C++11新特性从using化名模板到模板模板参数

C++20:非类型模板参数中的非捕获 lambda

如何优雅处理多参数返回/无参数返回——std::optional