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

如何在C++中递归定义Concept?现有CRTP相关问答未覆盖解法

实现递归的C++ Concept

你需要的递归概念可以通过C++20概念的短路求值特性实现,以下是修正后的代码:

#include <concepts>
#include <ranges>

template <typename T>
concept my_object = std::integral<T> ||
    (std::ranges::sized_range<T> &&
     std::ranges::input_range<T> &&
     my_object<std::ranges::value_t<T>>);

实现说明

  1. 递归终止条件:优先检查类型是否为整数类型(std::integral<T>),满足则直接匹配概念,终止递归。
  2. 范围类型检查:若类型不是整数,先确认它是带大小的范围(std::ranges::sized_range),同时确保是输入型范围(std::ranges::input_range)——这一步保证我们能安全获取范围的元素值类型,避免输出型范围(无值类型)导致的编译错误。
  3. 递归匹配:最后递归检查范围的元素值类型是否符合my_object概念。

原代码的问题修正

  • 替换typename R::value_type为std::ranges::value_t<T>:标准库中部分范围的元素类型需通过迭代器 traits 获取,std::ranges::value_t是更通用、规范的取值类型方式。
  • 添加std::ranges::input_range约束:避免输出型范围(仅支持写入,无元素值类型)触发编译错误。

测试示例

#include <vector>
#include <list>
#include <string>

// 验证符合概念的类型
static_assert(my_object<int>);
static_assert(my_object<std::vector<int>>);
static_assert(my_object<std::vector<std::vector<long>>>);
static_assert(my_object<std::list<char>>);
static_assert(my_object<std::string>);

// 验证不符合概念的类型
static_assert(!my_object<double>);
static_assert(!my_object<std::vector<double>>);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:25:33