Uso del argumento de plantilla vacía en la implementación de modismos de detección temprana
Enn4502 los autores describen una implementación temprana del idioma de detección que encapsula elvoid_t
truco. Aquí está su definición junto con el uso para definir un rasgo parais_assignable
(realmente esis_copy_assignable
)
template<class...>
using void_t = void;
// primary template handles all types not supporting the operation:
template< class, template<class> class, class = void_t< > >
struct
detect : std::false_type { };
// specialization recognizes/validates only types supporting the archetype:
template< class T, template<class> class Op >
struct
detect< T, Op, void_t<Op<T>> > : std::true_type { };
// archetypal expression for assignment operation:
template< class T >
using
assign_t = decltype( std::declval<T&>() = std::declval<T const &>() );
// trait corresponding to that archetype:
template< class T >
using
is_assignable = detect<void, assign_t, T>;
Mencionan que no les gusta esto debido a lavoid
utilizado en elis_assignable
rasgo:
Aunque el código resultante era significativamente más comprensible que el original, no nos gustó la interfaz de detección anterior porque elvoid
El argumento en la llamada de metafunción es un detalle de implementación que no debe filtrarse al código del cliente.
sin embargo, elvoid
no tiene ningún sentido para mí en primer lugar. Si trato de usar este rasgo de tipo para detectar siint
es copia asignable, me salestd::false_type
Manifestación.
Si reescribois_assignable
como:
template< class T >
using
is_assignable = detect<T, assign_t>;
Lo que tiene más sentido para mí, entonces el rasgo parece funcionar correctamente:Manifestación
Entonces mi pregunta aquí es¿Estoy malinterpretando algo en este documento, o fue simplemente un error tipográfico?
Si seestaba un error tipográfico, entonces no entiendo por qué los autores sintieron la necesidad de discutir cómo no les gustabavoid
goteando, lo que me hace bastante seguro de que solo me falta algo.