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
相关产品推荐
相关产品推荐

