如何在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>>);
实现说明
- 递归终止条件:优先检查类型是否为整数类型(
std::integral<T>),满足则直接匹配概念,终止递归。 - 范围类型检查:若类型不是整数,先确认它是带大小的范围(
std::ranges::sized_range),同时确保是输入型范围(std::ranges::input_range)——这一步保证我们能安全获取范围的元素值类型,避免输出型范围(无值类型)导致的编译错误。 - 递归匹配:最后递归检查范围的元素值类型是否符合
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
相关产品推荐
相关产品推荐

