c++ - 在编译时使用枚举作为索引分配数组的值 (C++)

标签 c++ enums constexpr compile-time array-initialization

我正在尝试通过枚举使用 C 样式数组作为映射,但我无法按部分初始化数组...我将通过代码更好地解释自己:
我有类似的东西:

enum Objects{CAR = 0, PLANE, BOY};

我有:

static const char* texturePaths[] = {"..\\car.png", "..\\plane.png", "..\\boy.png"};

这实际上按照我想要的方式工作,即

initTexture(texturePaths[CAR]);

但通过这种方式,我必须确保我以相同的顺序声明枚举和数组。 我想做这样的事情:

enum Objects{CAR = 0, PLANE, BOY, size};
const char* texturePaths[Objects::size];
texturePaths[BOY] = "..\\boy.png";
texturePAths[CAR] = "..\\car.png";
...

我知道这可行,但我需要在一个函数内执行并调用它,所以运行时。我想在编译时做,因为有永远不会改变的常量值,在运行时做是一种浪费。
我也知道 constexpr 可以通过 lambda 函数来完成,但我不知道该怎么做

最佳答案

您标记了 constexpr,因此您可以使用 C++11 或更新版本,因此您可以使用 std::array。 一般建议:尽可能使用 std::array,而不是旧的 C 风格数组。

I want to so it at compile time

如果您接受 C++17 解决方案(?),您可以使用 std::arrayoperator[] 的非常量版本是(从 C++17 开始)constexpr

因此您可以创建一个constexpr 函数来根据需要初始化std::array

enum Objects{CAR = 0, PLANE, BOY, size};

constexpr auto getTexturePath ()
 {
   std::array<char const *, Objects::size>  ret {{}};

   ret[BOY] = "..\\boy.png";
   ret[CAR] = "..\\car.png";
   // ...

   return ret;
 }

并将结果保存在constexpr(重要!)变量中

   constexpr auto texturePath { getTexturePath() };

以下是一个完整的 C++17 编译示例,其中包含一些 static_assert() 作为 texturePath 的初始化已在编译时完成的证明。

#include <array>
#include <type_traits>

enum Objects{CAR = 0, PLANE, BOY, size};

constexpr auto getTexturePath ()
 {
   std::array<char const *, Objects::size>  ret {{}};

   ret[BOY] = "..\\boy.png";
   ret[CAR] = "..\\car.png";
   // ...

   return ret;
 }

int main()
 {
   constexpr auto texturePath { getTexturePath() };

   static_assert( texturePath[CAR][3] == 'c' ); 
   static_assert( texturePath[CAR][4] == 'a' ); 
   static_assert( texturePath[CAR][5] == 'r' ); 
 }

关于c++ - 在编译时使用枚举作为索引分配数组的值 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51420946/

相关文章:

c++ - C++中的循环迭代

c++ - 模板化成员函数中的模板化参数类型

java - 获取 Java 中 Enum 常量的所有值? (是否有内置方法可以做到这一点,或者我需要编写自己的 setter/getter ?)

c++ - consteval 函数是否允许依赖于函数参数的模板参数?

c++ - 优化编译时应该知道的if-else,但信息在不同的项目中

c++ - constexpr、数组和初始化

getter 的 c++ const 正确性问题

c++ - 从二进制文件中读取空终止字符串 C++

java - 为什么这个@Override 不正确?

vb.net - 如何在多个项目中使用扩展方法