我在板上发现了一个参数包扩展,但我不明白到底发生了什么
I've found a parameter pack expansion here on the board and I don't understand what exactly is going
我在黑板上看到了一个我不明白的代码片段:
struct expression_sequence
{
template<typename... Ts>
expression_sequence(Ts&&... ts) { }
};
template<typename T, class Tuple = std::vector<T>>
class vector
{
public:
template<typename... Elements>
vector(Elements&&... elements)
{
m_elements.reserve(sizeof...(Elements));
expression_sequence{ (m_elements.push_back(std::forward<Elements>(elements)), 0)... };
}
private:
Tuple m_elements;
};
expression_sequence{ (m_elements.push_back(std::forward<Elements>(elements)), 0)... };
到底发生了什么,为什么它有效?
我不明白为什么我们需要用(
和, 0)
包围m_elements.push_back(std::forward<Elements>(elements))
.(为什么0
,即为什么int
?(m_elements.push_back(std::forward<Elements>(elements)), 0)
的类型是什么?
这是一种解决方法,等待折叠表达式。
目前,push_back
只接受一个元素,因此您无法解压缩参数列表。
使用这个技巧,使用类及其(让我说)可变参数构造函数,您可以成功地解压缩参数包,但该类仍然需要一个类型列表,即使它不使用这些参数。
因此,使用周围的部分(
和, 0)
实际上允许支持结构从int
列表中自动推断其类型,以便编译该代码。
有人可能会争辩说支撑结构是完全无用的。
当然,这只不过是一个技巧,因为折叠表达式计划在修订版 C++17 中。
相关文章:
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 这C++代码中发生了什么C++(指数函数)
- 哪种方式更快?究竟发生了什么,我们没有看到什么?
- 从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?
- 这个片段中关于 n 在 pc[i] 中的表示发生了什么
- istringstream,num1 和 num2 在这里发生了什么?
- 究竟发生了什么,我们需要在 c++ 中双重调度/访客
- 我是否能够确定在部署一个程序后发生了什么,我在数组末尾写入?
- 这个阶乘程序内部发生了什么?
- C++ - *(int**) 地址?这里发生了什么?
- C++用用户输入在循环中填充 char 数组:输入整个字符串时到底发生了什么?
- 让对象知道它创建的 show 函数中发生了什么
- 这里的矢量数组发生了什么?
- 增加顶级常量指针时发生了什么
- 当另一端将其关闭时,插座发生了什么
- C :我堆栈顶部发生了什么
- 此递归中发生了什么?我需要仅使用递归/无循环来计算和备份
- 这个 std::vector 构造函数中发生了什么
- 编译器认为 int 是一个字符串.发生了什么事情
- 无法运行简单的 std::async 和 std::future 测试程序。错误:"has initializer but incomplete type."发生了什么?