C ++ 14 bruke alias for is_same :: verdi

stemmer
7

Dette spørsmålet bruker is_same<uint64_t, decltype(val)>::value.

Jeg forventet det å være en C ++ 14 using alias: is_same_vligner på hjelpetyper: conditional_t, enable_if_tog tuple_element_tsom jeg bruker i mitt svar . Fordi det eneste jeg noen gang bruke noen av disse funksjonene for å få type. Så *_thelper bare er fornuftig.

Hvilket bringer meg til spørsmålet mitt, hvorfor er det ingen using alias is_same_vi C ++ 14? Det eneste jeg bruker is_samefor er det er value. Kanskje bruken av is_sameer ikke typisk for mal erklæringer?

Publisert på 09/03/2015 klokken 10:07
kilden bruker
På andre språk...                            


3 svar

stemmer
4

Jeg vil si at den primære årsaken til å innføre _thjelpere var å kvitte seg med behovet for å sette typenameoveralt. Når man bruker en type egenskap slik som conditional, eller tuple_elementi forbindelse med en mal, slik at det kommer an på en templat-parameter (som er en meget vanlig bruk tilfelle), må man for å prefiks konstruktet std::conditional<X, Y, Z>::typemed typename. Du trenger ikke å gjøre det med _thjelpere, fordi de ikke er nestet i noe som avhenger malparameterne.

Du trenger ikke å legge slike prefiks for std::is_same<X, Y>::value, fordi memeber valueer ikke en type.

For det andre, hvordan ville du introdusere en hjelper typen for en verdi, likevel? Det beste du kan gjøre er en variabel mal. Siden det ville bare spare skrive ::value, i stedet for typename /*...*/ ::type, var det sannsynligvis ansett unødvendig.

Svarte 09/03/2015 kl. 10:24
kilden bruker

stemmer
8

Introduksjon

Den primære årsaken til innføring std::enable_if_t<cond, T>som en kortere form for std::enable_if<cond, T>::typeikke å barbere av bare en telling av 4 tegn.

Siden std::enable_if, og andre type-egenskaper i sitt slag, er mest brukt i avhengige sammenhenger, det er ganske smertefullt å måtte skrive (A) når (B) ville nok:

Eksempel

template<class T, class = typename std::enable_if<cond, T>::type> // (A)
struct A;

template<class T, class = std::enable_if_t<cond, T>>              // (B)
struct A;


avhengige Names

Vi trenger type-navn før std::enable_iffordi ::typeer en avhengig-navn , og uten den standarden sier at uttrykket skal tolkes som om ::typeer faktisk en verdi .

std::is_same<T, U>::valueer virkelig en verdi , så det er ikke behov for bruk av type-navn ; som igjen gjør at vi effektivt barbering av en ren telling av 4 tegn .. ingenting mer.


Videre lesning



Så, hvorfor er det ikke en variabel-mal for std :: is_same ?

Rett og slett fordi det ikke er så stor av et behov, slik at ingen gjorde foreslå tillegg i tid; som de fleste er fornøyd med under alternativer:

std::is_same<T, U> {} == std::is_same<T, U>::value
std::is_same<T, U> () == std::is_same<T, U>::value


Videre lesning

Det er et forslag skrevet av Stephan T. Lavavej , for å legge variabel-maler for passende type-egenskaper .

Svarte 09/03/2015 kl. 10:39
kilden bruker

stemmer
6

is_same_v(og andre *_vtypen egenskaper) har blitt foreslått av N3854 . De gjorde ikke gjøre i C ++ 14, men de er i bibliotek Fundamentals TS .

En av bekymringene var en potensiell overlapping med Concepts Forslag som kan gi et bedre alternativ for type egenskaper (og mange andre aktuelle meta-programmeringsteknikker). En utdatert, men tydeligere forklaring på begreper kan bli funnet her .

Svarte 09/03/2015 kl. 15:44
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more