具有初始化列表的类初始化的std :: array成员变量

时间:2018-10-27 20:53:38

标签: c++

在c ++ 17中,您可以做到

std::array a{ "one", "two", "three" };

并获得一个std::array<const char*, 3>。太棒了!

由于数组成员变量必须在类声明中指定其大小,因此不能用作类变量。我想用一个任意长的初始化列表初始化数组和一个或多个constexpr方法创建一个类。我希望唯一的构造函数将初始化列表作为参数。有办法吗?

1 个答案:

答案 0 :(得分:5)

您可以使用以数组大小为模板的类(如果需要,还可以使用元素类型),该类具有可变构造函数。像这样:

template <typename T, std::size_t N>
struct custom_array {
    std::array<T, N> data;

    template <typename... Args>
    constexpr explicit custom_array(Args... args) : data{args...} {
    }
};

要能够推论N,您还需要这样的推导指南:

template <typename... Args>
explicit custom_array(Args... args) -> custom_array<std::common_type_t<Args...>, sizeof...(Args)>;

您可以找到完整的示例on Compiler Explorer