2011-09-05 80 views
6

是否有可能以及爲什麼要這樣做?用戶定義類型的static_cast

class Foo; 
class Bar; 

...... 

Foo foo; 
Bar bar = static_cast<Bar>(foo); 

通常的static_cast使用具有數字類型和指針,但它可以與用戶定義的數據類型的工作,a.k.a類?

+0

是的,它可以工作,但您也必須知道如何使用它 - 這裏是每個演員在C++中做什麼的開始:http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be-used – birryree

回答

10
Bar bar = static_cast<Bar>(foo); 

此演員表將失敗。 FooBar是不兼容的類型,除非下面的ATLEAST之一爲真:

  • FooBar衍生,或者
  • Bar具有一個構造函數Foo
  • Foo具有用戶定義轉換爲Bar

這裏更大的問題不在於它是否會成功投射。更大的和實際的問題應該是:你想從這樣的演員中得到什麼?爲什麼你想首先做這樣的事情?它應該做什麼?我的意思是,Bar對象將如何從Foo對象初始化?

明智的方法來轉換一個類型到另一個是通過以下方式之一:

要麼定義Foo爲:

class Foo : public Bar 
{ 
    //... 
}; 

或定義Bar爲:

class Bar 
{ 
    public: 
     Bar(const Foo &foo); //define this constructor in Bar! 
}; 

或提供Foo中的轉換函數爲:

class Foo 
{ 
    public: 
     operator Bar(); //provide a conversion function Foo to Bar! 
}; 
+1

或者它會失敗嗎?如果'Foo'實現了一個轉換運算符到'Bar'? –

+0

@Kerrek:我已經用這些細節更新了我的答案。 – Nawaz

+1

保證+1 –

11

這裏的規則:

表達static_cast<T>(e)是有效的,當且僅當下面的變量定義是有效的

T x(e); 

其中x一些發明變量。

所以,一般來說,兩個不相關的類型不能互相轉換。但是,如果一個類型是從另一個類型派生的,或者當一個類型定義了另一個類型的轉換函數,或者具有構造函數時只接受另一個類型的單個參數 - 在這些情況下,static_cast將會被明確定義。

它有沒有道理?例如,如果T定義了一個構造函數,該構造函數使用單個U並且構造函數爲explicit,那麼static_cast<T>(e)其中e是U類型,這會非常有意義

+1

它在通用代碼中特別有意義,例如,如果T可以是用戶定義類型,也可以是內置類型。那麼如果你寫了'(T(e))'而不是'static_cast (e)'(額外的parens來確保它不是'e'的定義),那麼這就是一個相當於'((T) e)',對於內置類型,它有可能變成'reinterpret_cast'。 –