簡體   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