Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ I';我在电路板上发现了一个参数包扩展,我不知道';我不明白到底发生了什么_C++_Templates_C++14_Variadic Templates - Fatal编程技术网

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该表达式不是一个参数包<代码>元素和
元素
都是。可以展开包含包的表达式。