2016-05-23 24 views

risposta

38

Certo, utilizzare decltype:

auto var_a = bar(t); 
decltype(var_a) b; 

È possibile aggiungere CV-qualificazioni e riferimenti a decltype prescrittori, come se si trattasse di qualsiasi altro tipo:

const decltype(var_a)* b; 
+0

potrebbe essere degno di menzione che decltype() ti fornisce il tipo * esatto * in questo esempio, se var_a è un riferimento, b non sarà il default costruibile e fallirà Compilare chiaramente, questo può essere il caso anche per qualsiasi tipo definito dall'utente – Arvid

+4

È possibile aggirare il problema di riferimento con ['std :: remove_reference'] (http://en.cppreference.com/w/cpp/types/remove_reference): 'std :: remove_reference :: type b; ' – Mego

18
decltype(var_a) var_b; 

E un Lorem Ipsum per raggiungere il minimo richiesto di 30 caratteri per ogni risposta.

+8

Il Lorem Ipsum mi ha venduto. – KyleKnoepfel

+8

Se la tua risposta è solo in codice, e così poco che devi aggiungere assurdità, chiediti se è una buona risposta (buona! = Utile) o meno. Prendi in considerazione il collegamento a [documentazione] (http://en.cppreference.com/w/cpp/language/decltype) per esempio. – Tas

+1

@Tas Sembra che tu sia dell'opinione che questa risposta non sia utile. Perchè no? – immibis

11

Nonostante la bella risposta di @TartanLlama, questo è un altro modo in cui è possibile utilizzare decltype per denominare effettivamente il tipo specificato:

int f() { return 42; } 

void g() { 
    // Give the type a name... 
    using my_type = decltype(f()); 
    // ... then use it as already showed up 
    my_type var_a = f(); 
    my_type var_b = var_a; 
    const my_type &var_c = var_b; 
} 

int main() { g(); } 

Forse vale la pena menzionarlo per ragioni di completezza.

Non sono alla ricerca di crediti perché è quasi la stessa della risposta di cui sopra, ma la trovo più leggibile.

+0

Il downvote è interessante. Mi piacerebbe sapere di cosa si tratta almeno ... – skypjack

+0

Forse è perché hai una chiamata superflua a 'f()'. Quindi, a seconda della natura di 'f()' (tempo di calcolo lungo, effetti collaterali ecc.) Questo potrebbe essere molto cattivo. –

+0

@ M.Herzkamp Stiamo parlando del tempo di compilazione, non è vero?Ad ogni modo, solo curioso, non mi piace molto chi va senza lasciare un commento da spiegare - quelli sono i commenti che di solito aiutano a migliorare le mie conoscenze, tutto qui. – skypjack

6

Nell'antichità prima del C++ 11 arrivavano persone che lo trattavano con modelli puri.

template <class Bar> 
void foo_impl(Bar var_a) { 
    Bar var_b; //var_b is of the same type as var_a 
} 

template <class T> 
void foo(T t) { 
    foo_impl(bar(t)); 
} 


F_1 bar(T_1 t) { 

} 

F_2 bar(T_2 t) { 

} 
+0

E un downvote è per ...? –

+0

Non era il mio voto, ma suppongo di aver postato una risposta che non è più rilevante per C++ 11 e più recente per una domanda che è stata codificata in C++ 11. – hvd

+4

@hvd per quanto so che i modelli sono ancora presenti in C++ 11 ... –

Problemi correlati