2014-02-28 43 views
1

我正在嘗試使用enum class,但發現從與枚舉邏輯對應的其他類型轉換時遇到困難。這裏有一個例子:在初始化時將'char'轉換爲枚舉

enum class ElementType { 
    unknown, 
    signedInt 
}; 

struct VectorType { 
    int vectorSize; 
    ElementType elementType; 
    int elementSize; 
} 

我希望能夠初始化說

VectorType vt {4, 's', 32}; 

所以我試圖從焦炭中定義轉換操作,以枚舉像這樣一個VectorType

operator ElementType(char c) { 
    switch (c) { 
    case 's': return ElementType::signedInt; 
    default : return ElementType::unknown; 
    } 
} 

但是這並不奏效,因爲它給出了以下錯誤:

error: ‘operator ElementType(char)’ must be a nonstatic member function 

因此,唯一的解決辦法,我能想出是創建一個單獨的構造器:

VectorType(int vsz, char etp, int esz) { 
    vectorSize = vsz; 
    elementType = make_elementType(etp); 
    elementSize = esz; 
} 

,並有全球非會員make_elementType()函數處理與轉換。有沒有辦法避免這種情況,即是否有辦法使用VectorType vt {4, 's', 32};來初始化VectorType

感謝

回答

1

你或許應該定義枚舉值:

enum class ElementType : char { 
    unknown = 'u', 
    signedInt = 's' 
}; 

class關鍵字將添加範圍的保護和消除值的隱式轉換;你不能分開這兩個功能。如果你想在這個現代的風格來寫,最好的辦法就是明確地投在初始化:

VectorType vt {4, static_cast<ElementType>('s'), 32}; 

或者是用C樣式轉換有點寬鬆,

VectorType vt {4, (ElementType) 's', 32}; 
+0

我不知道!謝謝。我創建了一個構造函數,將char作爲第二個參數,然後使用static_cast 將參數轉換爲ElementType。我仍然可以稱它爲'VectorType vt {4,'',32};' – stanm

1

嘗試

VectorType vt {4, ElementType::signedInt, 32}; 

或者,使用普通的enum

enum ElementType { 
    unknown, 
    signedInt 
}; 

然後說

VectorType vt {4, signedInt, 32}; 

enum class是的specifica lly旨在不允許隱式轉換。我看不出你會如何期望從char自動轉換到ElementType

如果您確實需要這樣的映射,例如從用戶輸入轉換而來,您可以使用std::map<char, ElementType>,但這與enum s的理念完全相反。

至於你operator ElementType(char c),如編譯器說,這樣的轉換操作符只允許爲class的成員,而不是內置的類型,如char

+0

在上下文程序'ElementType'和'char'作爲解析器的一部分與一對一映射關聯。理想情況下,解析器會將映射抽象出來,但將VectorType打印爲4s32仍然很方便。 – stanm

+0

@stanm從概念上講,是的。但您不希望運行時計算僅針對樣式進行映射。除非''c''來自用戶輸入,你可以在你的問題中說。在這種情況下,請參閱我編輯過的與'std :: map'有關的答案。 – iavr