Seite 1 von 1
[C++] Abgeleitete Klassen zu statischer Funktion zwingen
Verfasst: 02.01.2011, 15:03
von Krishty
Hi,
Wie kann ich eine Schnittstelle entwerfen, deren Ableitungen eine statische Funktion je selber implementieren müssen? Also quasi eine abstrakte statische Funktion, die sich nicht überschreiben lässt?
Dass diese Funktion dann nur mit Kenntnis des endgültigen Typs abgerufen werden und nicht überschrieben werden kann ist gut so; dass der Compiler das Fehlen der Funktion bereits zur Kompilierzeit feststellen können wird ist mir auch klar. Es geht mir nur darum, die Einheitlichkeit bei allen Implementierungen der Schnittstelle zu wahren.
Gruß, Ky
Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen
Verfasst: 02.01.2011, 15:11
von klickverbot
Ad hoc würde ich sagen: Gar nicht, schon deswegen nicht, weil du keine Möglichkeit hast, in der Basisklasse an den konkreten Typ der abgeleiteten Klasse heranzukommen, um die statische Methode aufzurufen – außer du greifst auf CRTP zurück…
Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen
Verfasst: 02.01.2011, 15:20
von Krishty
Den konkreten Typ muss ich garnicht kennen; alle Zugriffe auf die statischen Funktionen geschehen von außerhalb. Aber mir wird auch gerade klar, dass das, was ich hier fordere, im Grunde nur ein Concept ist, das eine Gruppe von Klassen zwecks generischer Programmierung zur Implementierung einer nichtvirtuellen Funktion zwingen soll und damit so ziemlich unmöglich sein sollte. Verdammt.
Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen
Verfasst: 02.01.2011, 16:59
von klickverbot
Meine Antwort hat sich übrigens darauf bezogen, dass du, um mit der statischen Funktion innerhalb der Basisklasse auch nur irgendwas machen zu können (etwa überprüfen, ob sie mit einem Satz Dummy-Parameter aufrufbar ist), ja den Typ der abgeleiteten Klasse kennen müsstest, was eben ohne CRTP o.ä. nicht realisieren lässt.
Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen
Verfasst: 02.01.2011, 17:06
von Krishty
Darauf ist auch das „den konkreten Typ muss ich garnicht kennen“ meiner Antwort bezogen, und dass mir das egal ist, stand schon per „Dass diese Funktion dann nur mit Kenntnis des endgültigen Typs abgerufen werden […] kann ist gut so“ in meiner Frage ;) Wie gesagt – ich möchte nur die Implementierungen einheitlich halten; ich muss nicht von der Basisklasse aus mit den Funktionen arbeiten.
Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen
Verfasst: 02.01.2011, 17:48
von Sternmull
In der ATL wird dieses Problem gelöst indem die Basisklasse einen Templateparameter bekommt dem der abgeleitete Typ zugewiesen wird. Dadurch kann die Basisklasse auf den vollständigen Typ zugreifen. D.h. sie kann dann auch statische Memberfunktionen aufrufen die nur in der Abgeleiteten Klasse existieren. Das ist bestimmt auch irgend ein Design-Pattern.
Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen
Verfasst: 02.01.2011, 17:53
von Krishty
Das große Problem ist, dass man die Basisklasse dann nicht mehr zur Generalisierung einsetzen kann – was auch immer vorher eine Referenz zur Basisklasse erwartet hatte, erwartet nun ein vollständig typisiertes Template. Polymorphie zwecks Generalisierung ist dann also unmöglich.
Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen
Verfasst: 02.01.2011, 18:23
von Aramis
In der ATL wird dieses Problem gelöst indem die Basisklasse einen Templateparameter bekommt dem der abgeleitete Typ zugewiesen wird. Dadurch kann die Basisklasse auf den vollständigen Typ zugreifen. D.h. sie kann dann auch statische Memberfunktionen aufrufen die nur in der Abgeleiteten Klasse existieren. Das ist bestimmt auch irgend ein Design-Pattern.
CRTP - Curiously Recurring Template Pattern.