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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:15:10