2017-03-22 59 views
0

我想一個C++宏,將打開的東西,看起來像這樣:具體的C++宏

safe_cast<Type>(object) 

Assert(dynamic_cast<Type>(object)) 

這可能嗎?

我可以使用:safe_cast(Type, object),但這不是我所追求的。

+0

對其擴展文本無效C的宏的請求不能成爲有效C問題的主題。已編輯標籤。 –

+1

爲什麼你不想使用模板函數呢? – Abstraction

+0

它不能用宏來完成(至少在你想讓它工作於像'map '這樣的類型時),但你可以很容易地用一個函數來完成它。 – nwp

回答

2

這不可能是一個宏觀的,但肯定是一個函數模板將被罰款:

template <class U, class T> 
U safe_cast(T *obj) { 
    auto * const p = dynamic_cast<U>(obj); 
    assert(p); 
    return p; 
} 

電話,你會dynamic_cast用指針。

+0

爲什麼在這裏使用'const'? – Default

+0

謝謝,這會被內聯嗎? – ZhuZhi

+1

@朱志如果不是,我會很驚訝。 – Quentin

1

請勿使用宏。我們沒有理由不能在這裏使用模板函數,所以我們應該!

template <typename T, typename U> 
T safe_cast_helper(U& u, std::true_type) 
{ 
    try { 
     return dynamic_cast<T>(u); 
    } 
    catch (std::bad_cast& e) 
    { 
     assert(false && "Exception thrown!"); // Or something better! 
    } 
} 

template <typename T, typename U> 
T safe_cast_helper(U& u, std::false_type) 
{ 
    auto ptr = dynamic_cast<T>(u); 
    assert(ptr); 
    return ptr; 
} 

template <typename T, typename U> 
T safe_cast(U& u) 
{ 
    return safe_cast_helper<T>(u, std::is_reference<T>::type()); 
} 

你可以使用這個,你通常會使用一個dynamic_cast,無論是用引用或指針。但是,我會建議在某種程度上改進錯誤報告!在聲明之前,寫日誌或寫東西應該是謹慎的。