我想一個C++宏,將打開的東西,看起來像這樣:具體的C++宏
safe_cast<Type>(object)
到
Assert(dynamic_cast<Type>(object))
這可能嗎?
我可以使用:safe_cast(Type, object)
,但這不是我所追求的。
我想一個C++宏,將打開的東西,看起來像這樣:具體的C++宏
safe_cast<Type>(object)
到
Assert(dynamic_cast<Type>(object))
這可能嗎?
我可以使用:safe_cast(Type, object)
,但這不是我所追求的。
請勿使用宏。我們沒有理由不能在這裏使用模板函數,所以我們應該!
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
,無論是用引用或指針。但是,我會建議在某種程度上改進錯誤報告!在聲明之前,寫日誌或寫東西應該是謹慎的。
對其擴展文本無效C的宏的請求不能成爲有效C問題的主題。已編輯標籤。 –
爲什麼你不想使用模板函數呢? – Abstraction
它不能用宏來完成(至少在你想讓它工作於像'map'這樣的類型時),但你可以很容易地用一個函數來完成它。 –
nwp