2015-06-03 4 views
6

Ich frage mich, was ist der Grund std::bool_constant und deren Verwendung für std::true_type und std::false_type (im Kopfteil definiert sowie der Vergleich structs <ratio>, vgl N4389) hinter der Einführung in C++ 17 ?Rationale hinter std :: bool_constant

Bisher habe ich nur in der Lage gewesen, die Papiere mit dem Wortlaut zu finden:

Während beiden Papiere auf einen "rationalen" verweisen - https://issues.isocpp.org/show_bug.cgi?id=51 - - der linked-to-comment feed sagt meistens, dass dies "basierend auf der Diskussion von C++ std-lib *" (vermutlich bezieht sich auf den privaten Reflektor?) ohne auf weitere Details zu gehen.

Hier ist die in der Dokumentation: http://en.cppreference.com/w/cpp/types/integral_constant

+1

SFINAE? –

+0

Mein erster thoguht auch. Lies mehr über SFINAE, das könnte nützlich sein. – MatthewRock

+1

@LightnessRacesinOrbit was hat SFINAE damit zu tun? –

Antwort

16

Es ist rein syntaktischer Zucker. Oft verwenden wir z.B. tag-Dispatching wie folgt: std::integral_constant<bool, ...>:

void foo_impl(std::false_type) { /*Implementation for stuff (and char) */} 
void foo_impl(std::true_type) { /*Implementation for integers but not char*/} 

template <typename T> 
void foo(T) { 
    foo_impl(t, std::bool_constant<std::is_integral<T>{} && !std::is_same<char, T>{}>()); 
} 

Ohne bool_constant, würden wir den gewünschten Typen einen längeren Typ-Spezifizierer zu bezeichnen, verwenden. Da die Verwendung von integral_constant für boolesche Werte besonders häufig auftritt, wurde eine kurze und kurze Art der Adressierung der Spezialisierungen verlangt, und bool_constant sorgt dafür.
In der Tat ist bool_constant nichts anderes als eine Alias-Vorlage für bool -specializations von integral_constant:

template <bool B> 
using bool_constant = integral_constant<bool, B>; 

Der einzige Grund, die Erklärungen für true_type und false_type (und andere Verwendungen von integral_constant<bool, ..>) wurden der Kürze halber in der geändert ist Standard, sogar; Es gab keine technische Notwendigkeit, da integral_constant<bool, false> und bool_constant<false> den exakt gleichen Typ bezeichnen.

+1

Immer wenn ich 'std :: integral_constant 'wiederhole, schreibe ich Aliase, die sehr ähnlich sind; Das ist ein Argument für. OTOH, ich benutze 'bool_t' anstatt etwas so lang. Kürze ist das Etwas. – Yakk

+0

Danke für die Antwort! Und, ja, ich habe bereits 'std :: integral_constant' verwendet, also hatte die Frage eine implizite" im Gegensatz zu nur mit 'std :: integral_constant ' wie vorher "Teil, die Sie auch beantwortet haben: Syntactic Zucker & Prägnanz macht Sinn :-) – Matt