You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:21:00