Pregunta

Estoy tratando de especializar parcialmente un rasgo para una matrices de no Chars:

template<typename T>
struct is_container : std::false_type {};

template<typename T, unsigned N>
struct is_container<T[N]>
: std::enable_if<!std::is_same<T, char>::value, std::true_type>::type {};

Visual Studio 2010 me da un C2039 (type no es elemento de enable_if...). Sin embargo, ¿no debería SFINAE simplemente fondo aquí en lugar de dar un error del compilador? ¿O SFINAE no se aplica en este caso?

Por supuesto, podría separar las especializaciones para no Char y Char:

template<typename T>
struct is_container : std::false_type {};

template<typename T, unsigned N>
struct is_container<T[N]> : std::true_type {};

template<unsigned N>
struct is_container<char[N]> : std::false_type {};

Pero realmente me gustaría saber por qué Sfinae no funciona en este caso particular.

¿Fue útil?

Solución

Consulte el tema '3.1 Especializaciones de clase de plantilla de habilitación' enhttp://www.boost.org/doc/libs/1_47_0/libs/utility/enable_if.html

Editar: en caso de que boost.org el enlace muera ...

3.1 Habilitación de la clase de plantilla Especializaciones de clase Plantilla Las especializaciones se pueden habilitar o deshabilitar con Enable_IF. Se debe agregar un parámetro de plantilla adicional para las expresiones de habilitador. Este parámetro tiene el valor predeterminado nulo. Por ejemplo:

template <class T, class Enable = void> 
class A { ... };

template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };

template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };

La instancia de A con cualquier tipo integral coincide con la primera especialización, mientras que cualquier tipo de punto flotante coincide con el segundo. Todos los demás tipos coinciden con la plantilla primaria. La condición puede ser cualquier expresión booleana en tiempo de compilación que dependa de los argumentos de la plantilla de la clase. Tenga en cuenta que nuevamente, no se necesita el segundo argumento para habilitar_IF; El valor predeterminado (nulo) es el valor correcto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top