Ja hast recht, ein paar Funktionen fehlten da.
Das schöne an der Lösung ist: Sie ist absolut robust. Du hast keine Data-Struct, die du durch irgendeine falsche Abfrage falsch interpretieren könntest oder so. Du hast die Typsicherheit, die dir vom Compiler garantiert wird, sollte sich irgendwo ein Fehler einschleichen kannst du das ganze nicht kompilieren, bis er behoben ist.
Was mir noch nicht so gut gefällt: Collider muss alle konkreten Untertypen kennen. Aber vielleicht hilft das hier:
http://sourcemaking.com/design_patterns/visitor/cpp/2
Ich habe es jetzt nur grob überschlagen, aber es scheint so, als würde dabei im Grunde das Dispatching auf andere Klassen aufgeteilt, so dass deine Kollisionsklassen sauberer bleiben. Du hast damit dann im Grunde eine Typsichere Nachschlage-Tabelle, die sich zwar nicht besonders hübsch schreibt, dafür aber wieder sehr robust sein sollte.
Vielleicht hat ja noch jemand anderes eine gute Idee, wie man das eleganter lösen könnte.