在构造函数中初始化const数组

initializing a const array in the constructor

本文关键字:const 数组 初始化 构造函数      更新时间:2023-10-16

我正在尝试实现类似的东西

struct A {
    A(const int (&arr)[5])
      :  arr_(arr)
    {}
    const int arr_[5];
}

显然这不起作用。我的目的是保持arr_字段不变。实现此目的的最佳方法是什么(可以是C 11)?

使用 std::array

struct A {
    A(std::array<int, 5> const& arr)
      :  arr_(arr)
    {}
    std::array<int, 5> const arr_;
}

带有转发构造函数:

struct A {
    A(const int (&arr)[5]) : A(arr, std::make_index_sequence<5>()) {}
    const int arr_[5];
private:
    template <std::size_t ... Is>
    A(const int (&arr)[5], std::index_sequence<Is...>)
      : arr_{arr[Is]...}
    {}
};

您可以内部使用std ::数组并转换一个数组:

#include <array>
#include <utility>
template <typename T, std::size_t ... I>
constexpr std::array<T, sizeof...(I)>
make_sequence(std::integer_sequence<std::size_t, I...>, const T (&array)[sizeof...(I)])  {
    return { array[I] ... };
}
template <typename T, std::size_t N>
constexpr std::array<T, N>
make_sequence(const T (&array)[N]) {
    return make_sequence(std::make_index_sequence<N>(), array);
}

// Test
#include <cassert>
struct A {
    constexpr A(const int (&arr)[5])
      :  arr_(make_sequence(arr))
    {}
    const std::array<int, 5> arr_;
};
int main()
{
    int array[5] = { 0, 1, 2, 3, 4 };
    A a(array);
    assert(a.arr_[2] == 2);
    return 0;
}

但是,如果您可以自由修改A类的界面,请使用@ecatmur的答案。