首页 > 解决方案 > 初始化列表初始化的类 std::array 成员变量

问题描述

在 c++17 中你可以做

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

并得到一个std::array<const char*, 3>. 惊人的!

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

标签: c++

解决方案


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

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)>;

您可以在 Compiler Explorer 上找到完整的示例。


推荐阅读