【发布时间】:2021-10-05 13:30:05
【问题描述】:
我想要一个函数,它可以采用任何固定值类型的范围/视图。
int main()
{
std::array<std::pair<int, int>, 2> a{...};
std::array<std::pair<int, int>, 3> b{...};
generic_fun(a);
generic_fun(b);
};
当然可以
template <std::ranges::range R>
requires std::same_as<std::ranges::range_value_t<R>,std::pair<int,int>>
auto generic_fun(R range)
{
for(const auto& element : range)
return element.first;
}
但是 Visual Studio IDE 不知道 element 的类型。
我期待范围库具有某种类型,例如
template <typename T>
struct view
{
template <std::ranges::range R>
requires std::same_as<std::ranges::range_value_t<R>, T>
view(R);
T* begin() const;
T* end() const;
};
这会给我 ide 支持
auto generic_fun(view<std::pair<int,int>> a)
{
for (const auto& b : a)
return b.first;
}
为什么范围库中不存在这种类型?定义一个抽象出除范围/迭代器的值类型之外的所有类型的类型在技术上是不可行的吗?或者没有人关心这样做,因为唯一的原因是 ide 支持?
虽然有一个类型(在给定值类型上模板化)包装给定迭代器概念是很自然的,但 std 没有定义任何。 (如果互联网上有关于包装概念的类型的内容可以阅读,请您指出那里吗?)
【问题讨论】:
-
你的类型都是
arrays吗?您的问题仅以这些为例,而您假设的view<T>仅适用于连续范围...因此,如果是这种情况,则 this is the same question 具有相同的答案:使用span。 -
是的,这是我的问题。但我一直在寻找对范围和概念的理解,而不是解决引发问题的问题
-
我的意思是,如果问题是“为什么范围不为连续范围提供类型擦除视图?”答案是“确实如此:
span<T>”。如果问题是不是,那么澄清问题是什么会很有帮助。也许,删除连续的部分? -
@TomHuntington:这个问题真的只是关于 IDE 支持吗?因为无论是语言还是库都不存在让您的 IDE 满意。如果你想让它快乐,那么只需使用实际类型而不是
auto。毕竟是你写的。 -
@TomHuntington:一般来说,如果您别无选择,您只会对算法或范围的其他消费者使用类型擦除。实际上,所有形式的类型擦除也是如此。
标签: c++ iterator c++20 c++-concepts std-ranges