折叠表达式扩展包中的最大元素数
Fold expressions maximum number of elements in expansion pack
请考虑以下程序:
#include <iostream>
#include <algorithm>
template<typename T, std::size_t N, std::size_t... I>
T sum_impl(T (&a)[N], std::index_sequence<I...>)
{
return (a[I] + ...);
}
template<typename T, std::size_t N>
T sum(T (&a)[N])
{
return sum_impl(a, std::make_index_sequence<N>{});
}
int main()
{
int a[512] = {[0 ... 511] = 1};
std::cout << "Sum =" << sum(a) << std::endl;
}
演示
在上述情况下,恕我直言,折叠表达式是展开本来是 for 循环的好方法。自然出现的问题是:
- 每个供应商的折叠表达式扩展包中是否有最大数量的元素,以及我们如何获取/访问此数字(例如,在 VC++2017 中,由于某种原因,最大数量为 745,否则程序无法编译)?
- 折叠表达式的扩展包中是否有许多元素,如果超出,性能会受到影响。也就是说,是否有经验法则,如果超过这个数字,如果我们使用 for 循环会更好?
C++规范中折叠表达式的规范开始如下:
8.1.6 折叠表达式 [前折]
折叠表达式执行模板参数包的折叠 (17.5.3) 在二进制运算符上...
它持续了几段。其中没有任何内容设置C++编译器必须支持的折叠表达式的最小或最大大小。这在C++标准的这一部分中未指定;因此,这完全取决于个人C++实施。没有确定特定编译器限制的指定方法。您发现您的特定编译器将折叠表达式限制为 745 个值。该限制的原因显然与编译器的内部实现细节有关;如果不熟悉它们,就没有什么可说的了。其他编译器的限制可能更小或更大,或者仅受可用内存量的限制。
关于对模板参数包规范的引用,C++标准的该部分没有指定C++编译器必须支持的参数包的最小/最大大小。
编辑:有人指出,附件B列出了一些建议,但没有将它们指定为绝对要求;也没有明确指出折叠表达式的最大限制。
但是,附件B确实指出:
模板声明中的模板参数 [1 024]。
有人可能会争辩说,如果"参数"的这种用法将参数合并到参数包中,这将间接影响折叠表达式。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- (C++)分析树以计算返回错误值的简单算术表达式
- C++如何通过用户输入删除列表元素
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 提升精神:解析布尔表达式并简化为规范范式
- 调整大小后指向元素值的指针unordered_map有效?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 使用折叠表达式打印每个元素之间的空格
- 在什么基础上,由单个元素组成的参数包的折叠表达式被转换为未加括号的表达式
- 用一个表达式包装变元宏中的每个元素
- 在Eigen中使用一元表达式的逐元素运算
- C++错误:在使用运算符[]将元素插入std::map时,“表达式必须具有整型或非范围枚举类型”
- 在BSONArrayBuilder中包含正则表达式元素
- 如何使正则表达式识别html元素中的空白