【发布时间】:2020-10-21 15:13:46
【问题描述】:
我正在尝试创建一个概念ElementIterable,它可以确定类型是否为嵌套范围。例如,std::vector<int> 中的元素不可迭代,但 std::vector<std::vector<int>> 中的元素 (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
欢迎所有建议。
【问题讨论】:
-
为什么不简单地检查类型本身的
v.begin()->begin()和v.end()->end()T?
标签: c++ c++20 c++-concepts