我在电路板上看到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;
};
expression_sequence{ (m_elements.push_back(std::forward<Elements>(elements)), 0)... };
正在正是
我不明白为什么我们需要m_elements.push_back(std::forward<Elements>(elements))
和(
围绕, 0)
。 (为什么0
,为什么int
?)。什么是(m_elements.push_back(std::forward<Elements>(elements)), 0)
的类型?
答案 0 :(得分:2)
这是一种解决方法,等待fold expression。
目前,push_back
只接受一个元素,因此您无法解压缩参数列表
使用该技巧,使用类及其(我说)可变参数构造函数,您成功解压缩参数包,但该类仍需要类型列表,即使它不使用这些参数。
因此,使用周围的部分(
和, 0)
实际上允许支持结构从int
列表中自动推导其类型,以便编译该代码。 / p>
有人可能会说支持结构是完全无用的 当然,这只不过是一个技巧,因为折叠表达式计划用于修订 C ++ 17 。