Questa è solo una domanda sullo stile: non mi piace il modo di C++ per la metaprogrammazione del modello che richiede di usare il tipo restituito o di aggiungere un argomento fittizio extra per i trucchi con SFINAE . Così, l'idea mi è venuta è quello di mettere la cosa SFINAE nella definizione argomenti modello stesso, in questo modo:boost :: enable_if non in funzione firma
#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[]>();
}
Questo esempio rende g ++ si lamentano:
../src/afg.cpp:10:97: error: redefinition of ‘template void asd()’
SFINAE ci si lavora, perché se cancello per esempio quello con disable_if
, l'errore del compilatore è:
../src/afg.cpp:15:12: error: no matching function for call to ‘asd()’
che è quello che voglio.
Quindi, esiste un modo per eseguire SFINAE non nella firma "normale" di una funzione, vale a dire tipo di ritorno + elenco di argomenti?
EDIT: Questo è alla fine ciò che ho intenzione di provare il codice vero e proprio:
#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>();
}
Io uso C++ 0x roba invece di spinta perché fino a quando ho bisogno di C++ 0x per usare i valori predefiniti degli argomenti del template, non vedo alcun motivo per usare boost, che è il suo precursore.
wow, non sapevo che anche il tipo di modello poteva essere dinamico! Non accettando ancora la tua risposta perché devo verificare prima che questo trucco possa essere applicato al mio codice, ma sono abbastanza sicuro che lo farà. –