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

标签 c++ c++20 c++-concepts

我想将模板类型的数量限制为小于 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的正确方法是什么?一个概念?

最佳答案

要添加到其他人的答案中,您实际上可以通过执行以下操作来简化您的概念要求:

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。

关于C++ 要求模板变量数量小于 N,但失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76696331/

相关文章:

c++ - Python OpenCv 构建未在命令行中检测到 visual studio 2019

c++ - 在 extern "play"声明中使用参数常量对 "C"是否安全?

c++ - 如何使用 C++ 模板模拟类型引用?

c++ - 表达式必须有指向对象类型的指针

c++ - 使用std::make_signed_t时,概念解析为意外的功能模板

c++ - 使用 C++20 概念专门化类模板的成员函数

c++ - 存储 std::assume_aligned 指针 C++ 20

c++ - 为什么不将 [[nodiscard]] 应用于每个构造函数?

c++ - 如何以 constexpr 方式调用具有元组输入的模板化静态类方法

c++ - 概念可以与CRTP习语一起使用吗?