C++20 概念 : Element iterable concept

标签 c++ c++20 c++-concepts

我正在尝试创建一个概念 ElementIterable这可以确定类型是否嵌套范围。例如std::vector<int>中的元素不可迭代,但 std::vector<int> 中的元素( std::vector<std::vector<int>> )是可迭代的。关于使用的想法 std::iterator_traits<T>我想到了,实验代码如下。然而,这个ElementIterable概念不能作为预期的行为。有没有办法解决这个问题ElementIterable概念?

template<typename T>
concept ElementIterable = requires(typename std::iterator_traits<T>::value_type x)                        //  requires-expression
{
    x.begin();          // must have `x.begin()`
    x.end();            // and `x.end()`
};
这个的用法ElementIterable在这儿。
template<typename T> requires ElementIterable<T>
void Foo(T input);

template<typename T> requires ElementIterable<T>
void Foo(T input)
{
    std::cout << "Element iterable" << std::endl;
}

template<typename T>
void Foo(T input);

template<typename T>
void Foo(T input)
{
    std::cout << "Element not iterable" << std::endl;
}
函数的用法Foo .
int number = 1;
    
std::vector<decltype(number)> vector1;
vector1.push_back(number);
Foo(vector1);           //  Element not iterable

std::vector<decltype(vector1)> vector2;
vector2.push_back(vector1);
Foo(vector2);           //  Element not iterable
                        //      but expected behaviour is: Element iterable
欢迎提出所有建议。

最佳答案

如果你想询问一个类型是否是一个本身包含一个范围的范围,那只需应用 std::range输入两次:

template<typename T>
concept nested_range = std::ranges::range<T> && std::ranges::range<std::ranges::range_value_t<T>>
range_value_t提取 value_type来自范围的迭代器类型。 Here's a live example .

关于C++20 概念 : Element iterable concept,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64466642/

相关文章:

c++ - 抽象类 : invalid abstract return type for member function ‘virtual...’

C++ 单独的实现和头文件

c++ - 为什么 boost::multi_array 的 ConstMultiArrayConcept 有一个 NumDims 模板参数?

c++ - 这是关于 C++ 中的 <concept> 库的 BUG 吗?

c++ - 从函数返回常量字符指针

c++ - 使用 C++ 程序删除 unix 共享内存段

c++ - 具有多个模板参数的概念

c++ - 为什么可以使用 operator<=> 比较数组成员,但不能使用独立数组?

c++ - sfinae 与非类型模板参数的概念

c++ - 是否可以在概念中指定模板类?