首页 > 解决方案 > 概念 - 如何约束积分模板值

问题描述

有一个模板定义,如:

template<size_t N>
void foo( void ) {
  /* ... */
}

如何定义一个N必须为非零正值(N >= 1)的概念?

就像是:

template<size_t N>
concept NonZeroSize = /* to be implemented, N>=1 */

template<NonZeroSize N>
void foo( void ) {
  /* Do whatever only if N >= 1 */
}

谢谢!

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

解决方案


像这样:

template <size_t N> requires NonZeroSize<N>
void foo();

要不就:

template <size_t N> requires (N > 0)
void foo();

简洁形式是为类型概念保留的。


概念定义本身只是一个任意的布尔表达式:

template <size_t N>
concept NonZeroSize = (N > 0);

requires-expression只是一种特殊的表达式,在定义概念时非常有用,但它既不必在所有概念定义中使用,也不必出现概念定义中。这些东西是正交的。


推荐阅读