2011-06-05 5 views
13

Voglio solo sapere se ce n'è già uno fornito dallo standard. So che è facile fare uno voi stessiEsiste un tipo-tratto per rimuovere cv e riferimento di primo livello contemporaneamente?

// for C++03, use <tr1/type_traits> and std::tr1 
#include <type_traits> 

template<class T> 
struct remove_toplevel{ 
    typedef typename std::remove_reference<T>::type noref_T; 
    typedef typename std::remove_cv<noref_T>::type noref_nocv_T; 
    typedef noref_nocv_T type; 
}; 

ma penso che ho dimenticato qualcosa in là o avuto l'ordine sbagliato, quindi sarebbe bello avere uno preparato, se ne esiste uno.

+1

È probabilmente intendeva applicare 'remove_cv' a' noref_T', non a 'T' come nel tuo codice qui sopra. – AnT

+0

@Andrey: Woops, grazie, è stato un refuso. :) – Xeo

risposta

19

std::decay, credo, esegue questa funzionalità.

+0

Perfetto, sapevo che c'era qualcosa! Ho pensato che il decadimento fosse solo per 'array -> pointer' etc. – Xeo

+0

È interessante sapere, bella domanda. Ecco la [descrizione MSDN di std :: decay()] (http://msdn.microsoft.com/en-us/library/ee361638.aspx). A proposito, puoi concatenare tutti i tuoi typedef in una riga per essere meno prolissi se hai davvero bisogno di costruire la tua caratteristica. –

+0

@Xeo: Abbastanza sicuro che sia la funzione di "decadimento" per replicare la deduzione degli argomenti del modello, o qualcosa del genere. 'array -> pointer' è l'unica cosa che conosco nello Standard chiamato 'decadimento' a parte questo, quindi la confusione è facilmente realizzabile. – Puppy

2

preferisco che unisce le due funzionalità in quanto descrive esattamente ciò che l'intenzione è:

C++ 11 std::remove_cv<std::remove_reference<T>::type>::type

C++ 14 std::remove_cv_t<std::remove_reference_t<T>>

C++ 20 std::remove_cvref_t<T>

Problemi correlati