[C++] Abgeleitete Klassen zu statischer Funktion zwingen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

[C++] Abgeleitete Klassen zu statischer Funktion zwingen

Beitrag 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
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
klickverbot
Establishment
Beiträge: 191
Registriert: 01.03.2009, 19:22
Echter Name: David N.

Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen

Beitrag 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…
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
klickverbot
Establishment
Beiträge: 191
Registriert: 01.03.2009, 19:22
Echter Name: David N.

Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen

Beitrag 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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen

Beitrag 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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [C++] Abgeleitete Klassen zu statischer Funktion zwingen

Beitrag 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.
Antworten