Templates/Diskriminanten



  • Ich hab kürzlich diese Schönheit im Ada95-Standard gefunden und mich gefragt, wie das mit Templates gehen würde:

    type Person(Sex : Gender) is
    record
    Name : String(1 .. 20);
    case Sex is
    when M => Wife : Person_Name(Sex => F);
    when F => Husband : Person_Name(Sex => M);
    end case;
    end record;

    Hier werden 2 Typen impliziert deklariert. Person(Mandl) und Person(Weibl). Männer haben einen Zeiger zur Ehefrau, die per definitionem weiblich sein muß, Frauen einen Ehemann.

    Abgesehen davon, daß dieser Code bei Legalisierung der Homo-Ehe komplett bricht:

    Kann man so eine Parametrisierung in C++ irgendwie elegant hinbiegen?

    lg Andreas



  • Hallo,
    mein Ada-Studium liegt schon wieder ziemlich lange zurück, deshalb bin ich mir nicht sicher, ob ich den Code richtig verstehe.

    Entspricht sowas deiner Vorstellung:

    #include <string>
    using namespace std;
    struct M_ {};
    struct F_ {};
    
    template <class T>
    struct Person;
    template <> struct Person<F_>;
    
    template <>
    struct Person<M_>
    {
         Person(const char* name, Person<F_>* wife);
         string name_;
         Person<F_>* wife_;
    };
    
    template <>
    struct Person<F_>
    {
        Person(const char* name, Person<M_>* husband);
        string name_;
        Person<M_>* husband_;
    
    };
    
    int main()
    {
        Person<M_> bob("Bob", 0);
        Person<F_> alice("Alice", &bob);
        bob.wife_ = &alice;
    }
    


  • So wie ich das sehe (sag mir, wenn ich falsch liege) kann der Benutzer da noch ein drittes Geschlecht instanzieren. Ansonsten ist es equivalent. Danke schön.



  • elrick33 schrieb:

    So wie ich das sehe (sag mir, wenn ich falsch liege) kann der Benutzer da noch ein drittes Geschlecht instanzieren.

    Nur wenn er noch eine explizite Spezialisierung für einen dritten Typen erzeugt. Ansonsten erhält er einen Fehler ähnlich zu:

    error: incomplete type is not allowed

    Das liegt daran, dass das Base-Template nur deklariert, nicht aber definiert wurde.



  • Schön.

    BTW HumeSikkins
    Ich war auf deiner Homepage und bin vor lachen fast vom Stuhl gefallen:

    If I were two-faced, would I be wearing this one?
    - Abraham Lincoln

    *g*



  • Ich weiß nicht, ob das dem Ada-Code entspricht, aber wäre hier ein template-Wertparameter nicht intuitiver? Also:

    enum Gender { M, F };
    
    template<Gender g>
    struct Person;
    
    ...
    // Wie bei Hume halt :)
    ...
    


  • operator void schrieb:

    Ich weiß nicht, ob das dem Ada-Code entspricht, aber wäre hier ein template-Wertparameter nicht intuitiver? Also:

    enum Gender { M, F };
    

    Jo. Das wäre für dieses *konkrete* Beispiel sicher besser (wobei ich M und F nicht gerne im globalen Namensraum hätte). Ich dachte mir, ich stelle einfach die allgemeinere Lösung vor (hier hätte ja auch ein bool gereicht).
    War aber zugegebenermaßen ein Fehler 😉


Anmelden zum Antworten