Wie schreibe ich stark def nicht-primitive Typen?

8

Beachten Sie das folgende Programm, in dem eine Funktion sowohl den erwarteten Typ als auch einen Typ akzeptiert, der ein typedef dieses Typs ist.

%Vor%

Wie Sie sehen, unterscheidet ein typedef nicht wirklich einen neuen Typ. Ich dachte stattdessen, vom Typ zu erben:

%Vor%

Gleiches Problem.
Wenn ich Boost anschaue, habe ich versucht, einen starken typedef auszuprobieren:

%Vor%

Fehler kompilieren:

%Vor%

Scheinbar funktioniert BOOST_STRONG_TYPEDEF nur bei primitiven Typen.
Ich habe versucht, die Vererbung erneut auszuführen, stoppe aber die implizite Konvertierung:

%Vor%

Das hat auch nicht funktioniert.

Fragen:

  1. Warum funktioniert boost strong_typedef nur bei primitiven Typen?
  2. Wie kann ich einen nicht-primitiven Typ "typedef" eingeben, um ähnliche Funktionen wie boost strong_typef zu erhalten?
Trevor Hickey 21.04.2014, 22:35
quelle

3 Antworten

5

Im Grunde brauchen Sie zwei nicht verwandte Klassen mit demselben Verhalten. Ich würde dafür eine parametrisierte Vorlage verwenden:

%Vor%     
grep 22.04.2014 02:01
quelle
3

BOOST_STRONG_TYPEDEF nimmt tatsächlich an, dass Typen gleichberechtigt sind ( == ), zuweisbar ( = ) und weniger als vergleichbar ( < ).

Wenn Ihr Typ nicht vorhanden ist, führt das Makro zu Code, der nicht kompiliert wird, wie Sie gesehen haben. Sie können ein eigenes Makro rollen oder Implementierungen für die erforderlichen Vorgänge bereitstellen.

Sie finden eine CUSTOM_STRONG_TYPEDEF in dieser Antwort vom Februar 2012: Verwendung von Vergleichsoperatoren bei Varianten mit enthaltenen Typen? , wodurch das Standardvergleichsverhalten ausdrücklich vermieden wird

Aktualisieren Das Beispiel wurde für Ihren Anwendungsfall expliziter gemacht, sehen Sie Live On Coliru

%Vor%     
sehe 22.04.2014 06:51
quelle
1

Vielleicht könnten Sie private Vererbung und einige using s verwenden?

%Vor%     
Daniel Frey 21.04.2014 23:02
quelle

Tags und Links