我想要一个函数,可以采用固定值类型的任何范围/视图。
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不知道元素
的类型。
我期待范围库具有类似
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 没有定义任何。(如果在互联网上有一些关于包装概念的类型可以阅读的内容,你能指出我吗?
range-v3的名称为any_view
int sum(any_view<int const&> v) { // <== not a function template
int s = 0;
for (int i : v) {
s += i;
}
return s;
}
std::list<int> l = {1, 2, 3};
assert(sum(l) == 3);
问题是,这个范围适配器非常昂贵。考虑一下迭代的工作方式。我们有一个这样的循环:
for (; it != end; ++it) {
use(*it);
}
即使对于输入迭代器,这也意味着您必须键入擦除:
运算符!=
运算符
运算符*
这是每个元素的三个间接调用(要么虚拟
函数调用,要么通过函数指针,具体取决于实现)。这是一个很大的开销,而且无论如何您都很少真正想使用它。因此,就添加到C 20中的范围适配器而言,优先级非常低,甚至不在我们未来添加范围适配器的计划中。
现在,对于连续的范围,情况有点不同,因为您总是可以只存储< code>(T*,size_t),而不管原始范围是什么。它仍然是类型擦除,但它是免费的——没有额外的开销。所以< code>span
还是没有人关心这样做,因为唯一的原因是ide支持?
在某些情况下,类型擦除实际上很重要。也许你正在存储一堆不同类型的范围。也许你把这个藏在ABI的边界上。但是IDE支持似乎是使用类型擦除的一个很弱的动力——尤其是在这样的环境中,这样做会产生相当大的性能开销。
[...]但是Visual Studio IDE不知道元素
的类型。
您也可以通过不使用 auto
来解决此问题。
问题内容: 这是我的第一篇文章,所以请对我“轻松”。:) …我对许多传统的编程语言非常熟悉,但是我是Go语言的新手,很难理解切片和范围的用法。下面的程序代码和注释说明了我的震惊。谢谢! 编写了自己的Mod函数,因为在Go库中找不到。 声明结构数组并添加一些记录 加载数据会产生我期望的输出 现在,我修改值并打印它们,以查看它们是否显示为已修改。这看起来像预期的那样。 现在,我只需再次遍历同一范围并打
问题内容: 给你 为什么不选择1-11? 他们是只是决定随机执行此操作,还是有一些我没有看到的价值? 问题答案: 因为调用包含10个等于的元素更为常见。请记住,程序员更喜欢基于0的索引。 另外,请考虑以下常见代码段: 你能看到如果精确到这将是有问题的吗?程序员需要显式减1。这也遵循程序员喜欢的共同趋势。 如果你经常以1开头的范围调用范围,则可能需要定义自己的函数:
问题内容: 我正在制作一个要使用范围滑块的网站(我知道它仅支持Webkit浏览器)。 我已经将其完全集成并且可以正常工作。但我想使用a 来显示当前的幻灯片值。 我的意思是,如果最初滑块的值为5,那么在文本框中它应显示为5,当我滑动文本框时,其值应更改。 我可以仅使用还是使用。我想避免。可能吗? 问题答案: 这使用javascript,而不直接使用jquery。它可能有助于您入门。
我对C#UTF8编码感到困惑... 假设这些“事实”是正确的: Unicode是定义每个字符的“协议” 根据C#参考,每个字符的可接受范围为0x0000到0xFFFF。我不明白另一个字符是什么,它在0xFFFF之上,在Unicode协议中定义的? 与C#相比,当我使用Python编写UTF8文本时-它涵盖了所有预期范围(0x0000到0x10FFFF)。例如: 这对C不起作用。此外,当我将Pyth
我正在开发一个小的android演示应用程序,其中混合了一些java类和接口与kotlin。我想从一个名为MvpViewStateActivity的具有泛型类型参数的java类扩展: 其中只是一个空的java接口: MvpPresenter是这样一个java接口: 和SearchViewActivity(Java): 所以现在我创建了一个kotlin接口: 其中,Item是pojo数据类。 也是用
问题内容: 我需要基于连续数字(第N列)和这些数字涉及的相同“类别”(下面的C列)从表中提取连续范围。图形上看起来像这样: SQL Server是2005。谢谢。 问题答案: 结果 :
问题内容: 我想知道是否可以在Chrome和Firefox中显示刻度线以输入数字?我在这个问题上能找到的最接近的东西是这个。 问题答案: 当涉及到样式时,输入范围仍然有些噩梦。这就是说,在各大浏览器中显示刻度线 是 可能的,有点苦劳和浏览器的特定解决方案。 Internet Explorer / Edge 如您所知,默认情况下,如果添加HTML 属性,Internet Explorer将显示刻度。
问题内容: Sitepoint的r937足以帮助我确定需要从数据库返回正确结果的查询。 我需要的是能够将此查询用作作用域,并能够将其他作用域链接到该作用域。 查询是: 我试图使像这样的范围: 但是,当我尝试将另一个示波器链接到它时,它失败了。有没有办法像正常作用域一样运行此查询? 问题答案: 返回。但是您需要链接其他作用域。 使用将返回的ActiveRecord方法重写查询的一种方法是将其重新排列