2011-06-05 4 views
13

Solo quiero saber si ya hay uno proporcionado por la norma. Sé que es fácil de hacer uno mismo¿Existe un rasgo de tipo para eliminar el cv de nivel superior y la referencia a la vez?

// 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; 
}; 

pero creo que se me olvidó algo allí o dieron la orden equivocado, por lo que sería bueno tener un preparado, si existe.

+1

Usted probablemente tenga la intención de aplicar 'remove_cv' a' noref_T', no a 'T' como en su código anterior. – AnT

+0

@Andrey: Woops, gracias, fue un error tipográfico. :) – Xeo

Respuesta

19

std::decay, creo, realiza esta funcionalidad.

+0

Perfecto, ¡sabía que había algo! Pensé que 'decay' era para' array -> puntero', etc. – Xeo

+0

Eso es interesante de saber, buena pregunta. Aquí está la [descripción de MSDN de std :: decay()] (http://msdn.microsoft.com/en-us/library/ee361638.aspx). Por cierto, puedes encadenar todos tus typedefs en una línea para que sean menos detallados si realmente necesitas construir tu propio rasgo. –

+0

@Xeo: Bastante seguro de que la función de 'decaimiento' es replicar la deducción de argumentos de la plantilla, o algo así. 'array -> pointer' es lo único que conozco en el estándar denominado' decay' aparte de esto, por lo que la confusión se hace fácilmente. – Puppy

2

Yo prefiero la combinación de las dos funcionalidades ya que describe exactamente lo que la intención es:

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>

Cuestiones relacionadas