1

我正在尝试通过枚举使用 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 函数做到这一点,但我不知道该怎么做

4

1 回答 1

4

您标记constexpr了 ,因此您可以使用 C++11 或更新版本,因此您可以使用std::array. 通用建议:std::array尽可能使用旧的 C 样式数组。

我想在编译时这样做

operator[]如果您接受 C++17 解决方案 (?),您可以使用for的非 const 版本std::array是 (从 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' ); 
 }
于 2018-07-19T12:35:37.010 回答