如何定义C++ Positive概念以约束编译期求和函数参数为正数?
首先明确概念使用误区
你当前的写法里,Positive是作用在类型上的概念,默认只能约束类型本身的特性,比如“该类型支持和0比较”,但没办法直接检查传入参数的具体值是否为正。针对你编译期求和的需求,有两种常用实现方案:
方案1:用非类型模板参数,编译期直接约束值(最符合编译期求和的使用场景)
把所有求和值放到模板参数列表里,直接在概念层校验值的合法性:
template<auto N> concept Positive = N > 0; template<Positive... Ns> constexpr int sum() { return (Ns + ...); } // 调用示例 // constexpr int res = sum<1, 2, 3>(); // 编译通过,结果为6 // constexpr int err = sum<1, -2, 3>(); // 编译报错,提示-2不满足Positive约束
方案2:保留普通函数参数,在函数内做编译期校验
如果你希望保留函数传参的写法,需要额外加静态断言做值校验,概念层只负责约束参数是可参与算术运算的类型:
#include <type_traits> template<typename T> concept Arithmetic = std::is_arithmetic_v<T>; template<Arithmetic... T> constexpr int sum(T... x) { // 仅当所有参数都是编译期常量时会触发编译期校验 static_assert(((x > 0) && ...), "所有传入参数必须为正数"); return (x + ...); } // 调用示例 // sum(1, 2, 3); // 编译通过 // sum(1, -2, 3); // 编译期直接检测到负值,触发静态断言报错 // 如果要兼容运行时才知道值的参数,把static_assert换成运行时的if判断+异常抛出即可
补充说明
你原代码中requires块如果写{ t > 0 } -> std::convertible_to<bool>;,仅能保证T类型支持和0做比较运算,完全不会校验参数值是否真的大于0,不符合你的需求。
内容的提问来源于stack exchange,提问作者Mr.WorshipMe
相关产品推荐
相关产品推荐

