将大小为编译时常量的数组初始化为单个值

时间:2019-05-30 09:45:02

标签: c++ c++11

我有一个c样式的数组,其大小由#define定义,并且可以根据编译选项进行更改,例如

#if LINUX
# define SIZE 4
#else
# define SIZE 5
#endif
static int myArr[SIZE] = { /* ??? */ };

如何将整个数组初始化为非零值,例如所有42

2 个答案:

答案 0 :(得分:8)

我不知道C样式数组的解决方案,尽管使用constexpr和C ++ 17可以使用std::array做到这一点。

constexpr std::array<int, SIZE> createFilledArray (int value){
   std::array<int, SIZE> a{0};
   for (auto i = 0; i < SIZE; ++i)
       a[i] = value;
   return a;
}

static constexpr auto myArr = createFilledArray(42);

Code at compiler explorer

这的缺点是您不能更改数组。 如果从变量中删除constexpr,则编译器应该能够对此进行优化。

从C ++ 20开始,您可以强制进行初始化:

static constinit auto myArr = createFilledArray(42);

不确定该提案是否已合并到其中:请参见constinit proposal

答案 1 :(得分:3)

如果您坚持使用内置数组,则可以在函数中使用静态变量:

template <std::size_t N, std::size_t... Is>
auto arr_helper2(std::index_sequence<Is...>) -> int (&)[N]
{
    static int arr[N] = {((void)Is, 42)...};
    return arr;
}

template <std::size_t N>
auto arr_helper() -> int (&)[N]
{
    return arr_helper2<N>(std::make_index_sequence<N>{});
}

static int (&arr)[SIZE] = arr_helper<SIZE>();

例如:

int main()
{
    for (std::size_t i = 0; i < SIZE; ++i)
        std::cout << arr[i] << " ";
}

live demo