c++ - ¿Por qué void_t no funciona en SFINAE pero enable_if no funciona?
c++17 (1)
Esto parece estar relacionado con el problema CWG # 1980 (créditos a T.C. por corregirme) .
Como solución puede definir void_t
como:
template<typename... Ts> struct make_void { typedef void type;};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;
Estaba tratando de entender cómo funciona SFINAE
y estaba experimentando con este código
#include <type_traits>
struct One {
using x = int;
};
struct Two {
using y = int;
};
template <typename T, std::void_t<typename T::x>* = nullptr>
void func() {}
template <typename T, std::void_t<typename T::y>* = nullptr>
void func() {}
/*template <typename T, std::enable_if_t<std::is_same_v<typename T::x, typename T::x>>* = nullptr>
void func() {}
template <typename T, std::enable_if_t<std::is_same_v<typename T::y, typename T::y>>* = nullptr>
void func() {} */
int main() {
func<One>();
func<Two>();
}
El código comentado funciona pero el primero no . El compilador me da errores diciendo que hay una redefinición y que la deducción del argumento de la plantilla falló. ¿Podría alguien explicar por qué sucede esto? Los dos void_t
s deben ser independientes ¿verdad? Dado que una línea verifica x
y la otra para y
. ¿Cómo puedo arreglarlo?