2015-06-03 11 views
6

mi chiedo, qual è la logica dietro introduzione std::bool_constant e loro successiva utilizzazione per std::true_type e std::false_type (così come le struct confronto definiti nell'intestazione <ratio>, cfr N4389) in C++ 17 ?Logica alla base std :: bool_constant

Finora sono stato in grado di individuare i documenti che contengono il testo unico:

Mentre sia la carta si riferiscono ad una "logica" - https://issues.isocpp.org/show_bug.cgi?id=51 - - il feed di commenti collegati per lo più afferma che questo è "Basato sulla discussione su C++ std-lib *" (presumibilmente riferito al riflettore privato?) senza entrare in ulteriori dettagli.

Ecco la documentazione: http://en.cppreference.com/w/cpp/types/integral_constant

+1

SFINAE? –

+0

Anche il mio primo thoguht. Leggi su SFINAE, questo potrebbe essere utile. – MatthewRock

+1

@LightnessRacesinOrbit cosa c'entra con SFINAE? –

risposta

16

E 'puro zucchero sintattico. Spesso, usiamo ad es. tag-dispacciamento in questo modo:

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>{}>()); 
} 

Senza bool_constant, avremmo dovuto utilizzare un tipo-specifier più per designare il tipo desiderato: std::integral_constant<bool, ...>. Poiché l'utilizzo di integral_constant per valori booleani viene visualizzato in modo particolarmente frequente, è stato richiesto un modo breve e conciso di definire le specializzazioni e bool_constant lo fornisce.
Infatti, bool_constant è altro che un modello alias per bool -specializations di integral_constant:

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

L'unica ragione le dichiarazioni per true_type e false_type (e altri usi di integral_constant<bool, ..>) sono stati modificati è per brevità nel standard, pari; Non c'era alcuna necessità tecnica, come integral_constant<bool, false> e bool_constant<false> designare esattamente lo stesso tipo.

+1

Ogni volta che uso ripetutamente 'std :: integral_constant' finisco per scrivere alias in modo molto simile; che è un argomento per. OTOH, io uso 'bool_t' invece di qualcosa di così lungo. La brevità è il qualcosa. – Yakk

+0

Grazie per la risposta! E, sì, ho già usato 'std :: integral_constant', quindi la domanda era implicita" invece di usare semplicemente 'std :: integral_constant ' come prima "parte, a cui hai anche risposto: zucchero sintattico e concisione ha un senso :-) – Matt

Problemi correlati