我们不能从initializer_list创建一个std :: array,但我们可以使用带有可变参数的辅助函数创建它吗?

时间:2016-02-27 15:01:25

标签: c++ templates c++14

请考虑以下vector课程:

template<typename T, class Tuple = std::vector<T>>
class vector
{
public:
    using size_type = typename Tuple::size_type;

    template<class T = Tuple, class = std::enable_if_t<std::is_constructible<T, size_type>::value>>
    vector(size_type n)
        : m_elements(n)
    { }
    template<class T = Tuple, class = std::enable_if_t<std::is_constructible<T, std::initializer_list<T>>::value>>
    vector(std::initializer_list<T> init)
        : m_elements(init)
    { }

private:
    Tuple m_elements;
}; // class vector

template<typename T, std::size_t N>
using static_vector = vector<T, std::array<T, N>>;

template<typename T>
static_vector<T, /* N */> make_static_vector(T... elements) { /* ... */ }

问题在于我想std::array使用Tuple,但std::array无法构建initialiter_list。这就是我在这种情况下禁用vector的相应构造函数的原因。 (我知道在任何一种情况下我都可以使用std::copy(init.begin(), init.end(), m_elements.begin(),但这会产生其他问题。)

因为我想做static_vector<double> x = { 1, 2, 3 };这样的事情,我认为我最好的选择(随意纠正我)提供像make_static_vector这样的帮助函数。 (这不像initializer_list那么漂亮,所以,请再次提出更美妙的解决方案。)

我想写auto x = make_static_vector<double>(1, 2, 3);。我该如何实施呢?

1 个答案:

答案 0 :(得分:0)

一个简单的表格如下:

template <typename T,typename... Elements>
static_vector<T, sizeof...(Elements)>
  make_static_vector(Elements... elements)
{
    return static_vector<T,sizeof...(Elements)>(elements...);
}

您还需要为矢量创建一个可变参数构造函数:

template <typename... Args>
vector(Args... init)
    : m_elements{static_cast<T>(init)...}
{ }

如果您想避免使用需要双精度的整数来缩小错误,则static_cast是必需的。

如果你想使用完美转发,那么输入会更多,但它的想法是一样的。