【问题标题】:Checking that a template type T is part of a variadic parameter pack in C++17检查模板类型 T 是否是 C++17 中可变参数包的一部分
【发布时间】:2017-08-09 15:15:48
【问题描述】:

我想检查类型T 是否也是参数包Ts 的一部分。在 C++14 中有 solutions 可以做到这一点,但如果这可以在 C++17 中简化,我正在徘徊。如果在Ts 中找不到T,编译器应该停止(static_assertion 应该失败)。

template<typename... Ts>
class A
{
  template<typename T>
  void action() {
    // check that T is also in Ts (static_assertion)
  }
}

【问题讨论】:

  • 您链接到的解决方案是 5 行长。您希望简化多少?
  • 我的问题here 有四个工作行,答案只有一个。您在此处找到的用于制作包中某些类型的 vectors 的 tuple 的解决方案超过 10 行。它现在可以合二为一了。
  • @Sneftel,给你。单线。
  • 我确实去了。 :)

标签: c++ variadic-templates c++17


【解决方案1】:

我听说折叠表达式是新的热点:

static_assert((std::is_same_v<T, Ts> || ...));

【讨论】:

    【解决方案2】:

    如果您更喜欢库特性:

    static_assert(std::disjunction_v<std::is_same<T, Ts>...>);
    

    请注意,这会执行短路(在这里可能不是非常有益,但要记住一些事情)。折叠表达式同样可行:

    static_assert((std::is_same_v<T, Ts> || ...));
    

    (从@Barry 那里偷来的。)

    【讨论】:

      【解决方案3】:

      在 C++ 中使用折叠表达式很简单:

      template<typename... Ts>
      class A
      {
        template<typename T>
        void action() {
          static_assert((... || std::is_same_v<T, Ts>)), "Not!")
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-10
        • 2021-12-26
        • 2019-06-06
        • 2018-02-12
        • 1970-01-01
        • 2019-12-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多