2014-09-20 28 views
0

沒有拋出異常......的dynamic_cast基於這個答案,因爲預期

Finding the type of an object in C++

...我寫了這個代碼:

 static TVALUE getUpperBound() 
     { 
      SomeStruct<TVALUE>* t; 

      try 
      { 
       dynamic_cast<SomeStruct<bool>*> (t); 
       return 1; 
      } 
      catch (int e) 
      { 
      } 

      try 
      { 
       dynamic_cast<SomeStruct<unsigned char>*> (t); 
       return 255; 
      } 
      catch (int e) 
      { 
      } 

      try 
      { 
       dynamic_cast<SomeStruct<unsigned int>*> (t); 
       return 65535; 
      } 
      catch (int e) 
      { 
      } 

      return 0; 
     } 

但它不工作: -/

我知道有其他方法可以做到這一點(使用includes),但我需要得到t他的技術工作。

我不能在我的代碼中包含任何包含內容(這是一個很長的故事,但我根本不能)......因此,這種嘗試可以通過climits或typeinfo輕鬆完成。

任何人都可以向我解釋爲什麼這不起作用?

編輯1:

謝謝你們。我錯過了參考VS指針位。

這現在工作:

template <typename TVALUE> 
TVALUE getUpperBound() 
{ 
    SomeStruct<TVALUE>* t; 

    if (dynamic_cast<SomeStruct<bool>*> (t) != nullptr) 
     return 1; 
    if (dynamic_cast<SomeStruct<unsigned char>*> (t) != nullptr) 
     return 255; 
    if (dynamic_cast<SomeStruct<unsigned int>*> (t) != nullptr) 
     return 65535; 

    return 0; 
} 

編輯2:

我試圖@StilesCrisis建議和使用模板特

template <typename TVALUE> 
TVALUE getUpperBound(); 

template <> 
bool getUpperBound<bool>() 
{ 
    return 1; 
} 

template <> 
unsigned char getUpperBound<unsigned char>() 
{ 
    return 255; 
} 

template <> 
unsigned int getUpperBound<unsigned int>() 
{ 
    return 65535; 
} 

作品的魅力。更好的實施。謝謝!

+0

這將拋出一個exeption時,你會使用轉換爲引用類型,但你正在使用指針。仔細閱讀文檔 – grisha 2014-09-20 19:26:24

+0

@ user2451677:你爲什麼寫評論的答案? – 2014-09-20 19:26:59

+0

我沒有時間寫更詳細的答案 – grisha 2014-09-20 19:30:03

回答

1

您正在轉換爲指針。僅在投射到參考時纔會生成bad_cast

如果轉換爲參考不可取,您可以檢查nullptr

4

dynamic_cast如果其模板參數是引用類型,則僅在失敗時引發異常。
當它是指針類型時,dynamic_cast取而代之的是失敗時計算爲NULL

這在the preferred language reference得很清楚,你可以簡單地用Google搜索,其中:

5C)否則,運行時檢查失敗。如果在指針上使用dynamic_cast,則返回類型_new_type_的空指針值。如果在引用上使用它,則引發異常std::bad_cast

我也想不明白,爲什麼你期望的int被拋出,而不是一些派生std::exception。也許你希望在try塊中的return跳轉到匹配的catch塊?它沒有。

+0

dynamic_cast不是模板。它看起來像模板 – grisha 2014-09-20 19:31:18

+0

它是一個模板。對不起,沒有更清楚。 – Beakie 2014-09-20 19:36:53

相關問題