我在板上发现了一个参数包扩展,我不明白究竟会发生什么

时间:2016-03-04 22:39:09

标签: c++ templates c++14 variadic-templates

我在电路板上看到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)的类型?

1 个答案:

答案 0 :(得分:2)

这是一种解决方法,等待fold expression

目前,push_back只接受一个元素,因此您无法解压缩参数列表 使用该技巧,使用类及其(我说)可变参数构造函数,您成功解压缩参数包,但该类仍需要类型列表,即使它不使用这些参数。
因此,使用周围的部分(, 0)实际上允许支持结构从int列表中自动推导其类型,以便编译该代码。 / p>

有人可能会说支持结构是完全无用的 当然,这只不过是一个技巧,因为折叠表达式计划用于修订 C ++ 17