C++ I';我在电路板上发现了一个参数包扩展,我不知道';我不明白到底发生了什么
我在黑板上看到了一个我不明白的问题:C++ I';我在电路板上发现了一个参数包扩展,我不知道';我不明白到底发生了什么,c++,templates,c++14,variadic-templates,C++,Templates,C++14,Variadic Templates,我在黑板上看到了一个我不明白的问题: struct expression_sequence { template<typename... Ts> expression_sequence(Ts&&... ts) { } }; template<typename T, class Tuple = std::vector<T>> class vector { public: template<typename.
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;
};
struct expression\u序列
{
模板
表达式序列(Ts&&…Ts){
};
模板
类向量
{
公众:
模板
向量(元素和…元素)
{
m_元素保留区(元素的大小);
表达式序列{(m_元素.push_back(std::forward(元素)),0)…};
}
私人:
元组m_元素;
};
在表达式序列{(m_元素.push_back(std::forward(元素)),0)…}上到底发生了什么代码>为什么它能工作
我不明白为什么我们需要包围m\u元素。通过(
和,0)
向后推(std::forward(元素))
。(为什么0
,即为什么是int
?)。什么类型的(m_元素。向后推(std::forward(元素)),0)
?这是一个解决方法,等待解决
目前,push_back
只接受一个元素,因此您无法解压缩参数列表。
使用这种技巧,通过一个类及其(我说)可变构造函数,您成功地解包了参数包,但该类仍然需要一个类型列表,即使它不使用这些参数。
因此,使用周围的部分(
和,0)
实际上允许支持结构从int
列表自动推断其类型,以便代码编译
有人可能会说,支持结构是完全无用的。
当然,这只不过是个小把戏,因为折叠表达式是为C++17修订版设计的。这是一个解决方案,等待新版本的发布
目前,push_back
只接受一个元素,因此您无法解压缩参数列表。
使用这种技巧,通过一个类及其(我说)可变构造函数,您成功地解包了参数包,但该类仍然需要一个类型列表,即使它不使用这些参数。
因此,使用周围的部分(
和,0)
实际上允许支持结构从int
列表自动推断其类型,以便代码编译
有人可能会说,支持结构是完全无用的。
当然,这不过是个把戏,因为折叠表达式是为C++17版本设计的。我仍然不明白为什么(m_元素。push_back(std::forward(元素)),0)
在语法上是正确的<代码>推回
具有返回类型void
。那么,这个表达式的类型是什么?我注意到我可以编写autox=(1,1,1)
和x
的类型是int
。那里发生了什么事?以前从没听说过?啊,我明白了。因此,对于任何void foo(){}
,表达式(foo(),0)
的类型是int
,对吗?在本例中,第一个表达式是参数包。但是,这里的表达式类型也是int
。(我想这实际上是错误的,因为这里的第一个表达式是一个参数包)。我有一些问题要理解为什么(m_元素。push_back(std::forward(elements)),0)
是一个我们可以展开的参数包。@0xbadf00d该表达式不是一个参数包<代码>元素和元素
都是。包含包的表达式可以扩展。我仍然不明白为什么(m_元素。push_back(std::forward(元素)),0)
在语法上是正确的<代码>推回具有返回类型void
。那么,这个表达式的类型是什么?我注意到我可以编写autox=(1,1,1)
和x
的类型是int
。那里发生了什么事?以前从没听说过?啊,我明白了。因此,对于任何void foo(){}
,表达式(foo(),0)
的类型是int
,对吗?在本例中,第一个表达式是参数包。但是,这里的表达式类型也是int
。(我想这实际上是错误的,因为这里的第一个表达式是一个参数包)。我有一些问题要理解为什么(m_元素。push_back(std::forward(elements)),0)
是一个我们可以展开的参数包。@0xbadf00d该表达式不是一个参数包<代码>元素和元素
都是。可以展开包含包的表达式。