2012-05-31 56 views
3

在C中,我可以使用if/else語句測試枚舉的值。例如:在C++中測試枚舉值的另一種方法

enum Sport {Soccer, Basket}; 


Sport theSport = Basket; 

if(theSport == Soccer) 
{ 
    // Do something knowing that it is Soccer 
} 
else if(theSport == Basket) 
{ 
    // Do something knowing that it is Basket 
} 

是否有另一種方法可以用C++來完成這項工作?

+8

這不是「類型檢查」,你只是測試一個枚舉值.. – Nim

+0

你可以使用模板來做*實際*類型檢查。 – Pubby

+1

'switch'想到了...... –

回答

8

是的,您可以使用虛函數作爲接口的一部分,而不是使用if-else語句。

我給你一個例子:

class Sport 
{ 
public: 
    virtual void ParseSport() = 0; 
}; 

class Soccer : public Sport 
{ 
public: 
    void ParseSport(); 
} 

class Basket : public Sport 
{ 
public: 
    void ParseSport(); 
} 

和使用您的對象以這種方式後:

int main() 
{ 
    Sport *sport_ptr = new Basket(); 

    // This will invoke the Basket method (based on the object type..) 
    sport_ptr->ParseSport(); 
} 

這要歸功於C++增加了面向對象特性的事實。

+2

備註:1.在接口('= 0')中使用純虛擬; 2.不需要時不要使用動態分配。 –

5

您可以

1使用模板魔術在編譯時執行不同的和無關的類型不同的動作;

2在運行時使用繼承和多態性對繼承關係類型執行不同的操作(如gliderkite和rolandXu的答案);

3使用enum(或其他整數類型)的C風格switch語句。

編輯:(很簡單),例如使用模板:

/// class template to be specialised 
template<typename> struct __Action; 
template<> struct __Action<Soccer> { /// specialisation for Soccer 
    static void operator()(const Soccer*); 
}; 
template<> struct __Action<Badminton> { /// specialisation for Badminton 
    static void operator()(const Badminton*); 
}; 

/// function template calling class template static member 
template<typename Sport> void Action(const Sport*sport) 
{ 
    __Action()(sport); 
} 
+0

你能舉個例子使用模板嗎? – Nick

+0

@Nick見編輯。 – Walter

+0

謝謝你的例子+1 – Nick

2

你還在測試在C值,即枚舉值,theSport的不是類型。 C++支持運行時類型檢查,稱爲RTTI