[英]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.