Ich habs jetzt noch mal komplett neu geschrieben, das "#define is" hat in irgend einem std header fehler verursacht
Es gibt einen guten Grund, warum man Makros meidet (Alliteration, gut merkbar!), erst recht solche. Mit jedem Makro, das du einführst, machst du den Namen des Makros für alle anderen Teile des Programms (inklusive externe Bibliotheken!) unbenutzbar.
Warum nicht einfach
if (dynamic_cast<Foo*>(somePtr)) direkt im Code? Dann würdest du auch feststellen, dass innerhalb des
if-Zweigs praktisch zwangsläufig nochmal gecastet wird, und könntest den Cast gleich rausziehen:
Foo *foo = dynamic_cast<Foo*>(somePtr); if (foo) { use foo ... }. (Selbst
if (auto foo = dynamic_cast<Foo*>(somePtr)) { use foo ... } ist erlaubt).
Wenn du unbedingt eine Hilfsfunktion willst (in anderen, sinnvolleren Fällen!), dann spricht auch nichts gegen eine Notation wie
if (is_typeof_runtime<Foo>(somePtr)), zumal dann jeder sofort weiß, was los ist, anstatt von mit Makros hingehackten sprachfremden Konstrukten überrascht zu werden.
Und schließlich ist praktisch jeder Fall, in dem du den Laufzeittyp eines Objekts zu bestimmen versuchst, ein Fehler. Eine entsprechende Hilfsfunktion und gar eine eigene Syntax dafür kommt also dem Vorsatz gleich, maximal viele Fehler zu machen.