Articles of sfinae

¿Qué es decltype con dos argumentos?

Editar, para evitar confusiones: decltype no acepta dos argumentos. Ver respuestas. Las siguientes dos estructuras pueden usarse para verificar la existencia de una función miembro en un tipo T durante el tiempo de comstackción: // Non-templated helper struct: struct _test_has_foo { template static auto test(T* p) -> decltype(p->foo(), std::true_type()); template static auto test(…) -> std::false_type; […]

Explique C ++ SFINAE a un progtwigdor no C ++

¿Qué es SFINAE en C ++? ¿Puedes explicarlo en palabras comprensibles para un progtwigdor que no está versado en C ++? Además, ¿a qué concepto en un lenguaje como Python corresponde SFINAE?

Detectando constexpr con SFINAE

Estoy trabajando en la actualización de algunos códigos C ++ para aprovechar la nueva funcionalidad en C ++ 11. Tengo una clase de rasgo con algunas funciones que devuelven tipos fundamentales que la mayoría de las veces, pero no siempre, devuelve una expresión constante. Me gustaría hacer diferentes cosas dependiendo de si la función es […]

¿Por qué debería evitar std :: enable_if en las firmas de funciones?

Scott Meyers publicó el contenido y el estado de su próximo libro EC ++ 11. Escribió que un elemento en el libro podría ser “Avoid std::enable_if in function std::enable_if “ . std::enable_if se puede usar como un argumento de función, como un tipo de retorno o como una plantilla de clase o un parámetro de […]

C ++ SFINAE ejemplos?

Quiero entrar en más meta-progtwigción de plantillas. Sé que SFINAE significa “falla de sustitución no es un error”. ¿Pero alguien puede mostrarme un buen uso para SFINAE?

¿Cómo verificar si el operador == existe?

Intento crear un ejemplo que verifique la existencia del operator== (miembro o función no miembro). Comprobar si una clase tiene un operator== miembro operator== es fácil, pero ¿cómo verificar si tiene un operator== no miembro operator== ? Esto es lo que tengo que hacer ahora: #include struct A { int a; #if 0 bool operator==( […]

¿Qué es exactamente el “contexto inmediato” mencionado en el Estándar C ++ 11 para el cual se aplica SFINAE?

El párrafo 14.8.2 / 8 de la Norma C ++ 11 especifica las condiciones bajo las cuales una falla de sustitución debe o no dar como resultado un error de comstackción “dura” (causando por lo tanto la falla de la comstackción) o un error “suave” que simplemente hacer que el comstackdor descarte una plantilla de […]

¿Qué es “Expresión SFINAE”?

En http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx , el equipo de VC ++ declara oficialmente que aún no han implementado la función principal de C ++ 11, “Expresión SFINAE”. Sin embargo, los siguientes ejemplos de código copiados de http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html son aceptados por el comstackdor de VC ++. Ejemplo 1: template struct A {}; char xxx(int); char xxx(float); template A f(T){} […]

Metaprogtwigción: falla de la definición de función define una función separada

En esta respuesta , defino una plantilla basada en la propiedad is_arithmetic del tipo: template enable_if_t<is_arithmetic::value, string> stringify(T t){ return to_string(t); } template enable_if_t<!is_arithmetic::value, string> stringify(T t){ return static_cast(ostringstream() << t).str(); } dyp sugiere que, en lugar de la propiedad is_arithmetic del tipo, si to_string se define para el tipo, sean los criterios de selección […]

SFINAE para verificar funciones heredadas de miembros

Usando SFINAE, puedo detectar si una clase determinada tiene una función miembro determinada. Pero, ¿y si quiero probar las funciones heredadas de miembros? Lo siguiente no funciona en VC8 y GCC4 (es decir, detecta que A tiene una función miembro foo() , pero no que B hereda una): #include template struct has_foo { template struct […]