2013-11-24 35 views
1

在這些論壇上有幾個關於繼承C++枚舉的擴展問題(實際上是沒有邏輯的東西)。但是,爲了設置特定的值,繼承又如何呢? 目前,像在我的代碼如下:在C++中單獨枚舉聲明和定義11

//lib_impl.h 
enum class X { 
    a = 13, // these values are 
    b = 42 // implementation dependent 
} 

//lib.h 
#include "lib_impl.h" 

void some_func(X param) { 
    X x = X::a; 
} 

我只是想避免其實施「LIB」的的關係是不。可能的話,除了枚舉之外,必須使用其他的東西。由於即使在C++ 11我們只申報向前枚舉名的能力,而不是它的枚舉:

//lib.h 
enum class X { a, b } // this is both declaration and definition, unfortunately 

void some_func(X param) { 
    X x = X::a; 
} 

//lib_impl.h 
#include "lib.h" 

enum class X { // redefenition, compilation error 
    a = 13, 
    b = 42 
} 

什麼是此類問題的最佳編譯時的解決方案?

-

,因爲它似乎是在C++中不可實現的,什麼是解決此類問題的最常見的方式是什麼?將'imp'從'impl'的依賴關係保持原樣?可能「impl」可以分成兩部分,小部分將包含在'lib.h'之前,其他更大的部分將包含在它之後。是好的,還是我需要放棄使用枚舉來支持抽象類?

+1

編譯器應該如何生成'some_func'的代碼? 「X :: a」是一個編譯時常量,在這種情況下,編譯器需要以某種方式查看實際值。否則它是一個佔用空間的變量,在這種情況下,編譯器將生成用於從該空間加載值的代碼。你可以實現後者,我使'X'成爲一個實際的類,'''成爲它的靜態成員。 –

+0

靜態函數不能是虛擬的,可以嗎? – Grief

+1

不,他們不能。雖然我很難看到這個事實與手頭問題的相關性。 –

回答

2

公開帶有標稱值的enum(以0開頭,順序說)。在庫中,將這些值重新映射到具有實現相關值的內部enum(例如,使用外部值作爲索引的速度數組)。如果將所述enum值導出到外部(反向映射將更慢),請反轉映射。

+0

它不是編譯時,不是嗎? – Grief

+0

@悲傷號碼。您希望一個編譯單元具有一組值,另一個編譯單元具有不同的值。在編譯時,外部編譯單元不能依賴內部編譯單元中的值來執行所需操作。因此,要在運行時執行所要求的內容,將外部值映射到內部值。 – Yakk