2017-04-12 52 views
2

之間切換,我有一些代碼,我需要爲不同的情況下運行。我將不得不爲這些情況切換大部分枚舉和靜態。所以,讓我們說我有枚舉C++最好的辦法CONFIGS

enum class City { NY, LA, W_DC, ... } 
City capital = City::W_DC 

和其他情況

enum class City { LDN, BMH, EDB, ... } 
City capital = City::LDN 

假設我有很多的枚舉的,什麼是重複使用的大部分代碼和那些之間切換的最佳方式組態。清楚的是,這並不意味着在運行時發生,程序應該編譯爲一個案例,並且對其他任何事情都不知情。

編輯:下面StackOverflowUser使用宏

這將是存儲在不同的命名空間的不同枚舉CONFIGS和一個很好的辦法,然後做

#IFDEF USE_NAMESPACE_A 
    using namespace namespace_a 
#ELSE 
    using namespace namespace_a 
#ENDIF 
+0

爲什麼不結合枚舉? – user4581301

+0

這難道不幫我,像資本變量的例子 – chrise

+0

爲什麼不呢?如果它們在同一個枚舉中,則「City capital」可以很容易地包含「City :: W_DC」或「City :: LDN」的值。 – user4581301

回答

0

創建宏和使用#ifdef MACRONAME是最好的方式在我看來,在運行時間之前檢查一些東西。 您也可以創建constexpr變量並使用if來評估這些變量的值。由於變量是constexpr,編譯器很可能會優化它們。

0

一種選擇是創建單獨的源文件,每個文件包含要枚舉。然後製作不同的編譯目標,將編譯相關文件作爲構建的一部分。

如前所述,另一個選擇是使用#ifdef ...#else預處理器宏,但您可能有不同的編譯目標來定義包含正確文件的宏。而不是設置它,所以你必須更改代碼並更改構建,只需將其放入構建中即可。

但是,說實話,枚舉可能不是做你想要做什麼是最好的方式。在運行時從文件/數據庫/或其他數據源查找可能是一種更易於維護的方法。它顯然需要更多的工作,但如果這是長期保持的事情,那麼稍後你會感謝你自己。

+0

編譯目標實際上是相同的。不會在運行時查找通常會更慢?我寧願能夠在編譯時打破這一點,以避免函數的額外開銷 – chrise

+0

它不一定會更慢。如果你有一大堆未指數化的數據可以迭代,那麼肯定會慢一些。這一切都取決於你的實現。如果你的編譯目標是相同的,你必須弄清楚如何以某種方式傳遞#ifdef中使用的定義值。 – Nathan