我在板上发现了一个参数包扩展,但我不明白到底发生了什么
I've found a parameter pack expansion here on the board and I don't understand what exactly is going
我在黑板上看到了一个我不明白的code snippet:
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;
};
What exactly is going on at expression_sequence{ (m_elements.push_back(std::forward<Elements>(elements)), 0)... };
and why is it working?
我不明白为什么我们需要用 (
和 , 0)
包围 m_elements.push_back(std::forward<Elements>(elements))
。 (为什么 0
,即为什么 int
?)。 (m_elements.push_back(std::forward<Elements>(elements)), 0)
的类型是什么?
这是一个解决方法,等待 fold expression。
目前,push_back
只接受一个元素,因此您无法解压参数列表。
使用这个技巧,使用 class 及其(让我说)可变参数构造函数,您成功解压了参数包,但 class 仍然需要一个类型列表,即使它不使用这些参数。
因此,使用周围的部分 (
和 , 0)
您实际上允许支持结构从 int
的列表中自动推断其类型,以便该代码编译。
有人可能会说支持结构完全没用。
当然,这只不过是一个技巧,因为折叠表达式是为修订版 C++17.
计划的
我在黑板上看到了一个我不明白的code snippet:
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;
};
What exactly is going on at
expression_sequence{ (m_elements.push_back(std::forward<Elements>(elements)), 0)... };
and why is it working?
我不明白为什么我们需要用 (
和 , 0)
包围 m_elements.push_back(std::forward<Elements>(elements))
。 (为什么 0
,即为什么 int
?)。 (m_elements.push_back(std::forward<Elements>(elements)), 0)
的类型是什么?
这是一个解决方法,等待 fold expression。
目前,push_back
只接受一个元素,因此您无法解压参数列表。
使用这个技巧,使用 class 及其(让我说)可变参数构造函数,您成功解压了参数包,但 class 仍然需要一个类型列表,即使它不使用这些参数。
因此,使用周围的部分 (
和 , 0)
您实际上允许支持结构从 int
的列表中自动推断其类型,以便该代码编译。
有人可能会说支持结构完全没用。
当然,这只不过是一个技巧,因为折叠表达式是为修订版 C++17.