繁体   English   中英

如何将 constexpr 字符串数组作为参数传递?

[英]How to pass an array of constexpr strings as an argument?

我有一个文件,其中包含代表一些图标的字符串数组。

static constexpr char icons1[2][40] = {
  "icon1_A", "icon1_B"
};

static constexpr char icons2[3][30] = {
  "icon22_A", "icon2_B", "icons2_C"
};

然后我有一个要使用对这些图标的引用进行初始化的类。

class Display {
public:
  Display(const char ** _icons) : icons(_icons), current_icon(0) {}

  void print_next_icon() {
    std::cout << icons[++current_icon] << std::endl;
  }
  
private:
  const char **icons;
  size_t current_icon;
}

当我尝试通过将 constexpr 图标传递给Display类来初始化它时,出现编译器错误:

Display i1(icons1); 
Display i2(icons2);

我试过将它转换为const char** ,但编译器抱怨转换删除了属性。

这里的声明是不必要的复杂。 尽量保持简单:

static const char* icons1[] = {
  "icon1_A", "icon1_B"
};

如果您将这些作为参数传递,并且您需要确切知道有多少,那么使用某种终结符会有所帮助:

static const char* icons1[] = {
  "icon1_A", "icon1_B", nullptr
};

您可以在其中迭代此列表,直到您点击nullptr然后停止。

毫不奇怪, constexpr用于const表达式,就像在其中包含运算符和/或要计算的函数的更复杂的表达式一样。 这里没有必要,因为没有任何异国情调正在发生,这是一个直接的const声明。

这里值得注意的是, char**char[3][40]的内存布局完全不同 在第一种情况下,您有一个指针数组,其中这些指针指向任意内存位置,而在第二种情况下,您有一个有效的 120 字节连续块,根本没有指针。 这不能重新转换为其他形式,它需要创建一个新的指针数组。

话虽如此,您的函数假定这些指针将具有无限期的生命周期,这可能是有风险的。 使用std::string几乎总是更安全,就像在std::vector<std::string>中传递它们一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM