c++ - 用递增的数字初始化一个编译时常量大小的数组

标签 c++ c++11

我有一个数组,其大小是使用编译时常量设置的(在我的例子中是预处理器 #define)。我需要在编译时使用连续的数字对其进行初始化。我该怎么做?

简化示例:

#define ARR_SZ 5
struct C {
  C(int a) : a(a) {}
  int a;
};
C arr[ARR_SZ] = {{0},{1},{2},{3},{4}}; // This needs to adapt to any number

我可以使用 C++11,但不能使用更新的(尽管我有兴趣学习更新的技术,即使我不能在这个项目中使用它们)

最佳答案

C++14 代码(因为 std::integer_sequence):

#include <type_traits>
#include <array>

#define ARR_SZ 5
struct C {
  C(int a) : a(a) {}
  int a;
};

template<int ...Is>
auto make_C_arr(std::integer_sequence<int, Is...>) -> std::array<C, sizeof...(Is)> {
    return {{ {Is}... }};
}

auto arr = make_C_arr(std::make_integer_sequence<int, ARR_SZ>{});

int main () {

}

std::integer_sequence 等可在 C++11 中实现,但如评论中所述,因此用标准版本替换自制版本将提供特定于 C++11 的版本解决方案。

关于c++ - 用递增的数字初始化一个编译时常量大小的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54286610/

相关文章:

c++ - 如果大括号闭合列表的类构造函数大小错误,则编译时错误

c++ - 使用显式栅栏和 std::atomic 有什么区别?

c++ - 处理应该能够管理 linux 用户帐户的程序的用户权限的最佳实践是什么

c++ - 将可变模板参数传递给可变函数

c++ - std::shared_ptr 和继承

c++ - 如何转换 std::make_unique 以便我可以使用类中声明的函数?

c++ - std::vector 的高效直接初始化

c++ - 多线程应用程序中的关键部分和 if,else 条件

c++ - 无法在 Solaris 的最新编译器中将 xercesc 与新的 c+11 标志一起使用

c++ - Windows 中的 pipe fork 和 execvp 类似物