23 votos

¿Por qué C++11 rasgos de tipo no alias plantillas?

Pregunta Similar: ¿por Qué son type_traits implementado especializados plantilla de estructuras en lugar de constexpr? – pero con una respuesta diferente.

Me doy cuenta de que alias plantillas no pueden ser especializados y, por tanto, no puede en la actualidad ser utilizados para implementar los rasgos de tipo directamente1. Sin embargo, esta es una decisión consciente de la comisión, y tal y como yo lo veo no hay ninguna razón técnica para impedirlo.

Entonces, ¿no tiene más sentido para implementar los rasgos de tipo como alias de plantillas, la racionalización de su sintaxis?

Considere la posibilidad de

 typename enable_if<is_pointer<T>::value, size_t>::type
 address(T p);

frente a

 enable_if<is_pointer<T>, size_t> address(T p);

Por supuesto, esto introduce una ruptura de la interfaz de cambio al pasar de Impulso.TypeTraits – pero ¿es esto realmente un problema tan grande?

Después de todo, el código deberá ser modificado de todos modos desde los tipos residen en el espacio de nombres diferente y, como muchos moderna de los programadores de C++ son reacios a abrir espacios de nombres, será calificado de forma explícita (si sería cambiado en absoluto).

Por otro lado, se simplifica enormemente el código. Y dado que la plantilla de metaprogramación a menudo se mete profundamente anidadas, complicado y complejo, parece obvio que una clara interfaz es beneficioso.

Me estoy perdiendo algo? Si no, te agradecería una respuesta que no es mera conjetura, pero depende (y puede citar) conocimiento de la decisión del comité de justificación.


1 Pero muy bien indirectamente! Considere la posibilidad de:

template <typename T> using is_pointer = typename meta::is_pointer<T>::type;

Donde meta::is_pointer<T> corresponde a la actual std::is_pointer<T> tipo.

16voto

Howard Hinnant Puntos 59526

La mayoría de la respuesta concreta a tu pregunta es: nadie ha propuesto hacerlo de esa manera.

El comité de estándares de C++ es una multi-nacional, multi-empresa de recogida de los voluntarios. Estás pensando en él como un comité de diseño dentro de una sola organización. El comité de estándares de C++, literalmente, no puede hacer nada sin una propuesta para poner las palabras en el proyecto de norma.

Me imagino que la razón por la que no había propuesta es que los rasgos de tipo fue uno de los primeros propuesta, con el impulso de la implementación que se remonta a alrededor del año 2000. Y la plantilla de alias se tarde en llegar implementado. Muchos de los miembros del comité son reacios a proponer algo que no han aplicado. Y no era simplemente poca oportunidad para implementar su propuesta.

Había un montón de presión para enviar C++11. Realmente era la intención de enviar en 2009 y que cuando la fecha de la nave se deslizó, fue muy duro para hacer nada al documento de trabajo, además de la revisión de las características ya bajo consideración. En algún momento tienes que poner ideas nuevas en la parte posterior del quemador, para que usted nunca barco.

2voto

Potatoswatter Puntos 70305

Tipo de rasgos, como varias otras bibliotecas incluidas <memory> y <functional>, fueron heredados de C++ TR1. A pesar de que era una manera menos formal de documento, era más formal que el Impulso y la compatibilidad de la pena.

También, tenga en cuenta que los rasgos de tipo son todos los derivados de la std::integral_constant<bool>, lo que hace de implementar un constexpr función de conversión a bool. De modo que, al menos, guarda el ::value partes, si así lo desea.

1voto

Luc Danton Puntos 21421

Como una completa nota ya que parece que hay confusión sobre cómo alias puede o no puede ayudar a un rasgo como std::is_pointer:

Se puede seguir el Impulso.MPL ruta y decidir que vas a usar el Boost.MPL-estilo integral constantes, lo que significa que los tipos de

template<typename Cond, typename Then = void>
using enable_if = typename std::enable_if<Cond::value, Then>::type;

// usage:
template<
    typename T
    , typename = enable_if<std::is_pointer<T>>
>
size_t address(T p);

o usted puede decidir usar los valores en lugar

template<bool Cond, typename Then>
using enable_if = typename std::enable_if<Cond, Then>::type;

// can use ::value
template<
    typename T
    , typename = enable_if<std::is_pointer<T>::value>>
>
size_t address(T p);

// or constexpr conversion operator
template<
    typename T
    , typename = enable_if<std::is_pointer<T> {}>
>
size_t address(T p);

Tenga en cuenta que en el último caso no es posible utilizar enable_if<std::is_pointer<T>()>: std::is_pointer<T>() es un tipo de función (teniendo en void y regresando std::is_pointer<T>) y no es válido ya que nuestro alias toma un valor y no un tipo en este caso. Las llaves asegurar que es una expresión de la constante de lugar.

Como usted puede haber notado, std::is_pointer no se benefician de la plantilla de alias. Esto no es sorprendente en que es una característica en la que la parte interesante es el acceso a ::value, no ::type: plantilla alias sólo puede ayudar con los tipos de miembros. El type miembro de std::is_pointer no es muy interesante, ya que es un Impulso.MPL-estilo integral constante (en este caso, std::true_type o std::false_type), por lo que esto no nos ayuda. Lo siento!

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X