c++ - ¿De qué sirve "boost:: mpl:: identity<T>:: type" aquí?
templates argument-deduction (1)
Estaba comprobando la implementación de la clamp
en el impulso:
template<typename T, typename Pred>
T const & clamp ( T const& val,
typename boost::mpl::identity<T>::type const & lo,
typename boost::mpl::identity<T>::type const & hi, Pred p )
{
// assert ( !p ( hi, lo )); // Can''t assert p ( lo, hi ) b/c they might be equal
return p ( val, lo ) ? lo : p ( hi, val ) ? hi : val;
}
Si busco la documentación, la identity
devuelve el argumento de la plantilla sin cambios.
La metafunción de identidad. Devuelve X sin cambios.
Entonces, ¿de qué sirve usarlo aquí?
¿No es typename boost::mpl::identity<T>::type
equivalente a T
?
Un especificador de nombre anidado crea un contexto no deducido . Por lo tanto, un compilador no intentará deducir el tipo T
función de los parámetros segundo y tercero declarados como:
typename boost::mpl::identity<T>::type const &
El tipo T
se deducirá solo en función del tipo del primer argumento, y luego se usará para crear instancias de los tipos de los parámetros restantes. Usar el tipo de identity
es un truco común para evitar la deducción del tipo de argumento de la plantilla en ciertos parámetros, que de lo contrario daría lugar a un error de llamada ambigua en caso de que los tipos de argumentos difieran, pero utilicen el mismo parámetro de plantilla de tipo. También se puede desear a veces que un compilador no deduzca automáticamente el tipo y obligue al que llama a hacerlo por sí mismo.