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

C++20中如何用Concept限制auto非类型模板参数?

问题解决:用Concept约束非类型模板参数

你的问题出在非类型模板参数的Concept约束语法错误上。你定义的DigitalOutput是针对非类型参数的Concept,但在声明driver模板时,错误地将其当作类型约束来使用,导致编译器报错。

错误原因

template <DigitalOutput output>这种写法会让编译器误以为DigitalOutput是一个类型(比如类、typedef),但实际上它是一个接受非类型参数的Concept模板,因此触发了"'DigitalOutput' does not constrain a type"的错误。

修正方案

方案一:使用requires子句显式约束

保持你原有的DigitalOutput Concept定义,修改driver的模板声明,通过requires子句绑定约束:

template <auto gp>
concept DigitalOutput = requires() { gp.set(); gp.reset(); };

template <auto output>
requires DigitalOutput<output>
struct driver {
    // 类实现代码
};

方案二:直接在模板参数中绑定Concept

C++20及以上支持将Concept直接与非类型参数声明结合,语法上需要明确参数的类别:

template <auto gp>
concept DigitalOutput = requires() { gp.set(); gp.reset(); };

template <DigitalOutput auto output>
struct driver {
    // 类实现代码
};

方案三:改为约束类型的Concept(更通用)

如果你希望Concept能同时复用在类型参数场景,也可以将其改为约束类型的版本,再约束非类型参数的类型:

template <typename T>
concept DigitalOutputType = requires(T gp) { gp.set(); gp.reset(); };

template <DigitalOutputType auto output>
struct driver {
    // 类实现代码
};

以上三种写法都能正确约束你的GPIO描述符非类型参数,确保它们具备set()和reset()接口。

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:12:05