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



我试图通过枚举使用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样式数组。

我想在编译时

如果您接受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' ); 
}

相关内容

  • 没有找到相关文章

最新更新