代码之家  ›  专栏  ›  技术社区  ›  WL_Law

C++要求模板变量数小于N,但失败

  •  1
  • WL_Law  · 技术社区  · 1 年前

    我想将模板类型的数量限制为小于3。我预料到了 F(1,2,3) 没有编译,但它确实编译并打印了3。

    template <typename ...Ts>
    concept LessThan3 = requires {
      sizeof...(Ts) < 3;
    };
    
    template <typename... Ts>
    requires LessThan3<Ts...>
    void F(Ts... ts) {
      cout << sizeof...(ts);
    };
    
    int main() {
      F(1, 2, 3);  // Compile
    }
    

    但是,如果我明确地 sizeof...(Ts) < 3 在函数声明中, F(1,2,3) 不会编译,按预期工作。

    template <typename... Ts>
    requires(sizeof...(Ts) < 3) void F(Ts... ts) {
    void F(Ts... ts) {
      cout << sizeof...(ts);
    };
    // F(1,2,3) doesn't compile, expected.
    

    正确的方式是什么 require 一个概念?

    2 回复  |  直到 1 年前
        1
  •  3
  •   Amolgorithm    1 年前

    为了补充其他人的答案,您实际上可以通过以下操作简化您的概念要求:

    template <size_t Size>
    concept LessThan3 = (Size < 3);
    
    template <typename... Ts>
        requires LessThan3<(sizeof...(Ts))>
    void F(Ts... ts) {
      std::cout << sizeof...(ts);
    };
    

    您会看到,如果您传递两个参数,它就可以工作。但是,如果大于2,则会出现编译错误,说明它不满足LessThan3。

        2
  •  2
  •   3CxEZiVlQ    1 年前

    sizeof...(Ts) < 3 本身不起任何作用,则忽略计算结果。应该是

    template <typename ...Ts>
    concept LessThan3 = requires {
      requires sizeof...(Ts) < 3;
    };
    

    类似: N < 3 与。 static_assert(N < 3)