Verwenden Sie kein Makro. Es gibt keinen Grund, warum wir hier keine Template-Funktion verwenden können.
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());
}
diese Weise können Sie wie gewohnt einen dynamic_cast
, entweder mit einer Referenz oder einen Zeiger verwenden würde. Ich würde jedoch empfehlen, die Fehlerberichterstattung etwas zu verbessern! Vielleicht wäre ein Schreiben zu Protokoll oder etwas vorsichtig, bevor es sich durchsetzt.
Eine Anforderung für ein Makro, dessen Erweiterungstext nicht gültig ist C kann nicht Gegenstand einer gültigen C-Frage sein. Tags bearbeitet –
Warum möchten Sie nicht stattdessen eine Vorlagenfunktion verwenden? – Abstraction
Es kann nicht mit Makros getan werden (zumindest nicht, wenn Sie wollen, dass es für Typen wie 'map' funktioniert), aber Sie können es leicht mit einer Funktion machen. –
nwp