我正在尝试创造一个概念ElementIterable
它可以确定类型是否是嵌套范围。例如,中的元素std::vector<int>
不是可迭代的,但是元素 (std::vector<int>
) in 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
来自范围的迭代器类型。这是一个活生生的例子.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)