C++ concept能否同时匹配表达式返回值的目标类型及对应引用版本?
简化方案
你可以通过两种方式消除冗余,全程基于typename T::value_type实现校验,无需依赖运算转换的取巧逻辑:
方式1:定义通用辅助concept(复用性更好)
先定义一个通用匹配规则,后续其他类似校验场景也可以直接复用:
// 匹配类型为U 或者 U的左值引用 template <typename T, typename U> concept same_as_or_val_ref = std::same_as<T, U> || std::same_as<T, U&>; template<typename T> concept IntegralVector = std::integral<typename T::value_type> && requires(T t) { { t.size() } -> std::convertible_to<std::size_t>; { t[0] } -> same_as_or_val_ref<typename T::value_type>; };
方式2:直接嵌套规则(无需额外定义辅助concept)
如果不需要复用规则,可以直接把判断逻辑写在嵌套requires约束中,C++20标准完全支持:
template<typename T> concept IntegralVector = std::integral<typename T::value_type> && requires(T t) { { t.size() } -> std::convertible_to<std::size_t>; requires std::same_as<decltype(t[0]), typename T::value_type> || std::same_as<decltype(t[0]), typename T::value_type&>; };
你之前直接对两个requires子句用||拼接的写法本身语法有效,但冗余度高,上述两种写法都实现了校验逻辑的合并。
内容的提问来源于stack exchange,提问作者Chameleon
相关产品推荐
相关产品推荐

