簡體   English   中英

通過引用修改范圍枚舉

[英]Modifying scoped enum by reference

我越來越多地發現使用范圍難以使用的enums。 我正在嘗試編寫一組函數重載,包括用於通過引用設置/初始化值的作用域枚舉模板 - 如下所示:

void set_value(int& val);
void set_value(double& val);
template <typename ENUM> set_value(ENUM& val);

但是,我沒有看到如何在不引入多個臨時值的情況下編寫模板化版本的set_value

template <typename ENUM>
set_value(ENUM& val)
{
  std::underlying_type_t<ENUM> raw_val;
  set_value(raw_val);    // Calls the appropriate "primitive" overload
  val = static_cast<ENUM>(raw_val);
}

我相信除了raw_val之外, static_cast引入了第二個臨時值。 我認為編譯器可能會優化其中的一個或兩個,並且在任何情況下它都不應該在性能方面產生太大的影響,因為set_value調用也會生成臨時值(假設它沒有內聯),但這似乎仍然不夠優雅。 我想這樣做會是這樣的:

template <typename ENUM>
set_value(ENUM& val)
{
  set_value(static_cast<std::underlying_type_t<ENUM>&>(val));
}

...但這是無效的(相應的代碼也不是直接使用指針而不是引用),因為作用域的枚舉通過繼承與它們的底層基元無關。

我可以使用reinterpret_cast ,從一些初步測試看起來似乎有效(我想不出任何原因導致它不起作用),但這似乎在C ++中不受歡迎。

是否有“標准”方法來做到這一點?

我可以使用reinterpret_cast ,從一些初步測試看起來似乎有效(我想不出任何原因導致它不起作用),但這似乎在C ++中不受歡迎。

實際上, reinterpret_cast是違反嚴格別名規則的未定義行為。

消除單個mov指令(或者或多或少,復制寄存器的數據)是過早的微優化。 編譯器很可能能夠處理它。

如果性能非常重要,那么請遵循優化過程:配置文件,反匯編,理解編譯器的解釋,並在定義的規則中與它一起工作。

乍一看,您(和編譯器)可能更容易使用T get_value()等函數而不是void set_value(T) 雖然丟失了類型推導,但數據流和初始化更有意義。 如果這非常重要,您可以通過標簽類型重新獲得扣除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM