Várias especializações de modelo de classe SFINAE usando void_t
As especializações de modelos de várias classes são válidas, quando cada uma é distinta apenas entre padrões que envolvem parâmetros de modelo em contextos não deduzidos?
Um exemplo comum destd::void_t
usa-o para definir uma característica que revela se um tipo tem um membrotypedef
chamado "tipo". Aqui, uma única especialização é empregada. Isso pode ser estendido para identificar, digamos, se um tipo temou um membrotypedef
chamado "type1" ou um chamado "type2". O código C ++ 1z abaixo é compilado com o GCC, mas não com o Clang. Isso é legal?
template <class, class = std::void_t<>>
struct has_members : std::false_type {};
template <class T>
struct has_members<T, std::void_t<typename T::type1>> : std::true_type {};
template <class T>
struct has_members<T, std::void_t<typename T::type2>> : std::true_type {};