如何在C++概念(concept)中检测成员变量是否为整数类型
问题原因
你遇到的报错是因为{表达式} -> 概念的语法中,概念校验的是decltype((表达式))的类型:你代码中v是T类型的非const左值,v.x是int类型的左值,因此decltype((v.x))的推导结果是int&。而标准库的std::integral概念仅匹配纯整数类型,不包含引用、const/volatile修饰的整数类型,因此校验失败。
解决方案
有两种常用的修改方式可以实现你的需求:
方案1:使用嵌套要求显式消除类型修饰符
在concept中加入嵌套要求,先移除v.x类型的引用、cv修饰符后再做std::integral校验:
#include <concepts> #include <type_traits> // 引入类型萃取工具头文件 template <typename T> concept isIntegralX = requires(T v) { v.x; // 先校验成员x存在 // 嵌套要求:移除cv和引用后是整数类型 requires std::integral<std::remove_cvref_t<decltype(v.x)>>; };
方案2:封装自定义的忽略修饰符的整数concept
如果你想保留复合要求的写法,可以先封装一个自动处理类型修饰的concept再使用:
#include <concepts> #include <type_traits> template <typename T> concept relaxed_integral = std::integral<std::remove_cvref_t<T>>; template <typename T> concept isIntegralX = requires(T v) { {v.x} -> relaxed_integral; };
两种方案修改后,你原来的业务代码都可以正常编译运行。
内容的提问来源于stack exchange,提问作者Archduke
相关产品推荐
相关产品推荐

