Esto es solo una pregunta sobre el estilo: no me gusta el camino de C++ para la metaprogramación de plantillas que requiere usar el tipo de retorno o agregar un argumento ficticio adicional para los trucos con SFINAE . Por lo tanto, la idea que se me ocurrió es poner la cosa SFINAE en la definición argumentos de plantilla en sí, así:boost :: enable_if no en la firma de función
#include <iostream>
#include <boost/type_traits/is_array.hpp>
#include <boost/utility/enable_if.hpp>
using namespace std;
template <typename T, typename B=typename boost::enable_if< boost::is_array<T> >::type > void asd(){
cout<<"This is for arrays"<<endl;
}
template <typename T, typename B=typename boost::disable_if< boost::is_array<T> >::type > void asd(){
cout<<"This is for NON arrays"<<endl;
}
int main() {
asd<int>();
asd<int[]>();
}
En este ejemplo se crea g ++ se quejan:
../src/afg.cpp:10:97: error: redefinition of ‘template void asd()’
SFINAE existe en sí funciona, porque si elimino por ejemplo, el que tiene disable_if
, el error del compilador es:
../src/afg.cpp:15:12: error: no matching function for call to ‘asd()’
¿qué es lo que quiero.
Entonces, ¿hay alguna forma de lograr SFINAE no en la firma "normal" de una función, es decir, tipo de retorno + lista de argumentos?
EDIT: Esto es al final lo que voy a tratar en el código real:
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T, typename enable_if< is_array<T>::value, int >::type =0 > void asd(){
cout<<"This is for arrays"<<endl;
}
template <typename T, typename enable_if< !is_array<T>::value, int >::type =0 > void asd(){
cout<<"This is for NON arrays"<<endl;
}
int main() {
asd<int[]>();
asd<int>();
}
utilizo C++ 0x cosas en lugar de impulso, porque el tiempo que necesito C++ 0x para usar los valores predeterminados de los argumentos de la plantilla, no veo ninguna razón para usar boost, que es su precursor.
wow, yo no sabía que incluso el tipo de la plantilla podría ser dinámicos No aceptar su nuestra respuesta todavía porque primero tengo que comprobar que este truco se puede aplicar a mi código, pero estoy bastante seguro de que lo hará. –