2017-10-15 39 views
0

我在C#中爲字節碼解釋程序創建了一個類庫,作爲編碼練習。我有兩個字節碼解釋器,一個使用32位字,另一個使用64位字。我想創建一個在兩位口譯員之間共享的統一指令集。在C#中爲兩個不同字長的字節碼解釋程序使用enum作爲指令集

我想使用泛型來解決這個問題,就像我會使用C++模板:

(C++代碼)

template<typename T> 
enum Instruction : T { 
    add, 
    subtract, 
    ... 
} 

而且我本來有32位翻譯使用Instruction<int32>和64位解釋器使用Instruction<int64>

但是,在做了一點研究之後,我沒有找到一種在C#中使用enum的泛型方法。

此C#代碼不會編譯:

enum Instruction<T> : T { 
    Add, 
    Subtract, 
    .... 
} 

有我丟失的東西在這裏還是我採取錯誤的做法完全?

+1

爲什麼不分享32位指令都解釋之間設置?或者如果你想有2個類庫 - 使用[條件編譯](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-if)。 – Dmitry

+0

如果你希望你的指令集是統一的,爲什麼需要64位指令?您將無法使用額外的位。 – IllidanS4

回答

3

這樣做的泛型不起作用,我建議的另一種方法是默認使用long作爲類型,然後將其包裝在一個類中,該類根據是否爲32位來驗證操作碼。

public enum Opcode : long 
{ 
    Add = 0L, 
    Subtract = 1L, 
    ... 
} 

public class Instruction 
{ 
    public Opcode Opcode { get; } 
    public Instruction(Opcode opcode) 
    { 
     if (is32Bit && ((long)opcode) > int.MaxValue) 
      throw new InvalidOperationException(); 
     Opcode = opcode; 
    } 
} 

另一種選擇是使用條件編譯爲梅德建議

#if IS_64_BIT 
public enum Opcode : long 
#else 
public enum Opcode : int 
#endif 
{ 
    Add = 0, 
    Subtract = 1, 
    #if IS_64_BIT 
    Multiply = long.MaxValue 
    #endif 
}