Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Designfrage: Tail einer leeren Liste     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Kellerautomat
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.06.2012
Beiträge: 910
Beitrag Kellerautomat Mitglied 20:32:39 24.06.2012   Titel:   Designfrage: Tail einer leeren Liste            Zitieren

Hallöle,

Ich bastle mir gerade eine TMP-Lib. Für Listen, repräsentiert durch das list-Template gibt es eine Template-Metafunktion "tail". Sollte tail bei einer leeren Liste ebenfalls eine leere Liste zurückgeben, oder sollte da eine static_assertion fliegen?

Grüße,
Der Kellerautomat
assert
Unregistrierter




Beitrag assert Unregistrierter 21:23:28 24.06.2012   Titel:              Zitieren

static assertion.

Leere Listen sind ein gängiges Abbruchkriterium für die Rekursion. Wer das missachtet, hat wahrscheinlich einen Fehler gemacht.
Kellerautomat
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.06.2012
Beiträge: 910
Beitrag Kellerautomat Mitglied 23:24:27 24.06.2012   Titel:              Zitieren

Hm, okay. Ist es eigentlich besser, wenn der User die Fehlermeldung vom Compiler + die Assertion bekommt, oder wenn ich dafür sorge, dass das Template im Fehlerfall gar nicht instanziert wird und der User somit nur die Assertion bekommt?

Sprich:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    namespace detail
    {
        template <typename L>
        struct tail : tail<typename L::type>
        {};
 
        template <typename Head, typename... Tail>
        struct tail<list<Head, Tail...>> : list<Tail...>
        {};
    }
 
    template <typename L>
    struct tail
        : extend_if // prevent messy template error from propagating for empty lists
        <
            length<L>,
            detail::tail<L>
        >
    {
        static_assert(length<L>::value != 0, "tail of empty list requested");
    };


Man beachte den Kommentar. extend_if ist, wenn die Bedingung (hier Länge ungleich 0) wahr ist, von typename detail::tail<L>::type abgeleitet, andernfalls leer. Somit bekäme der User im Fehlerfall nur den Fehler der Assertion, weil detail::tail nicht instanziert wird.
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 6874
Beitrag cooky451 Mitglied 00:42:18 25.06.2012   Titel:              Zitieren

Auch wenn es vielleicht eleganter erscheint das Instanziieren sofort zu verhindern, ich glaube jeder User wird dir dankbar sein für eine ordentlich Lesbare Fehlermeldung anstatt des Template-Stacks, den eine TMP-Liste so hinter sich herzieht.

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
Keksverteilungsbeauftragter


Zuletzt bearbeitet von cooky451 am 00:42:32 25.06.2012, insgesamt 1-mal bearbeitet
c++.de :: C++ (auch C++0x und C++11) ::  Designfrage: Tail einer leeren Liste   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.