2017-03-22 3 views
0

ich eine C++ Makro möchte, dass etwas, das wie folgt aussieht verwandeln:Spezifische C++ Makro

safe_cast<Type>(object) 

in

Assert(dynamic_cast<Type>(object)) 

Ist das möglich?

Ich könnte es tun mit: safe_cast(Type, object), aber es ist nicht, was ich danach bin.

+0

Eine Anforderung für ein Makro, dessen Erweiterungstext nicht gültig ist C kann nicht Gegenstand einer gültigen C-Frage sein. Tags bearbeitet –

+1

Warum möchten Sie nicht stattdessen eine Vorlagenfunktion verwenden? – Abstraction

+0

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

Antwort

2

Dies kann nicht ein Makro sein, aber sicher ein Funktions-Template wird in Ordnung sein:

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

Anruf als würden Sie dynamic_cast mit einem Zeiger.

+0

warum benutzen Sie 'const' hier? – Default

+0

Danke, wird das inline sein? – ZhuZhi

+1

@ZhuZhi Ich wäre sehr überrascht, wenn es nicht wäre. – Quentin

1

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.