papangue | Joel F a écrit :
c'est chelou. Faut trouver un cadre dans lequel tu va pouvoir utilisait la SFINAE. Le problème est que, si al fonction existe pas, bah tu pourra guère tenter de l'utiliser sans erreur de compil.
Ca serait une méthode ça aurait pu etre réglé à coup de boost:has_xxx masi en fonction libre
|
Merci pour ta réponse.
C'est exactement juste la réponse qu'il me fallait, compléter avec un peu de google. En utilisant la SFINAE il est possible de checker l'existence de fonctions membres ou même non membre comme dans mon cas.
Merci Joel pour cette info - j'en ai au passage profiter pour apprendre, comprendre ce que l'on pouvait faire avec cette bete.
pour ce qui est de ça:
Citation :
Le problème est que, si al fonction existe pas, bah tu pourra guère tenter de l'utiliser sans erreur de compil.
|
l'utilisation de la SFINAE permet de checker l'existence d'une méthode (membre ou non membre) sans erreur de compile. Ensuite avec le résultat renvoyer par ce mécanisme, rien ne m'empêche d'écrire une class template avec un paramètre bool, et de specialiser avec: true j'utilise la méthode puisqu'elle existe, false et bien je fait rien!
Juste pour ceux qui veulent des info pour comprendre comment ca marche, j'ai un lien assez sympa:
http://www.codeproject.com/KB/arch [...] etection12
Joel si tu as de la doc un peu plus poussée sur le sujet, je suis preneur!
juste pour illustration, un code test que j'ai écrit pour comprendre:
le fichier .h contenant l'ensemble des class et structure nécessaire à la mise en place de ce petit mécanisme:
Code :
- #include <ostream>
- class toto
- {};
- class tata
- {};
- std::basic_ostream<char>& operator<<(std::basic_ostream<char>& stream, const toto& value)
- {
- return stream;
- }
- typedef char NotFound;
- struct Found { char x[2]; };
- /**
- Structure to find functions like std::basic_ostream<char>& std::basic_ostream<char>::operator<<(T)
- */
- template <class T, std::basic_ostream<char>& (std::basic_ostream<char>::*)(T) >
- struct TestNonStatic_ostream { };
- template<class T>
- static Found Test_ostream(TestNonStatic_ostream<T,&std::basic_ostream<char>::operator<< >*);
- template<class T>
- static NotFound Test_ostream( ... );
- /**
- Structure to find functions like std::basic_ostream<char>& operator<<(std::basic_ostream<char>&, const T& )
- */
- template <class T, std::basic_ostream<char>& (*)(std::basic_ostream<char>&,const T& ) >
- struct TestNonStatic_operator_ref_const { };
- template<class T>
- static Found Test_operator_ref_const(TestNonStatic_operator_ref_const<T,&operator<< >*);
- template<class T>
- static NotFound Test_operator_ref_const( ... );
- /**
- Structure to find functions like std::basic_ostream<char>& operator<<(std::basic_ostream<char>&, T& )
- */
- template <class T, std::basic_ostream<char>& (*)(std::basic_ostream<char>&, T& ) >
- struct TestNonStatic_operator_ref { };
- template<class T>
- static Found Test_operator_ref(TestNonStatic_operator_ref<T,&operator<< >*);
- template<class T>
- static NotFound Test_operator_ref( ... );
- /**
- Structure to find functions like std::basic_ostream<char>& operator<<(std::basic_ostream<char>&, T)
- */
- template <class T, std::basic_ostream<char>& (*)(std::basic_ostream<char>&, T) >
- struct TestNonStatic_operator { };
- template<class T>
- static Found Test_operator(TestNonStatic_operator<T,&operator<< >*);
- template<class T>
- static NotFound Test_operator( ... );
- template<class T>
- struct test
- {
- static const bool check_presence = (sizeof( Test_ostream<T> ( 0 ) ) == sizeof(Found)) ||
- (sizeof( Test_operator_ref_const<T> ( 0 ) ) == sizeof(Found)) ||
- (sizeof( Test_operator_ref<T> ( 0 ) ) == sizeof(Found)) ||
- (sizeof( Test_operator<T> ( 0 ) ) == sizeof(Found));
- };
|
et maintenant le programme principale:
Code :
- int main(/*int argc, _TCHAR* argv[]*/)
- {
- bool test_ = test<int>::check_presence; // vaut true car la méthode est définit dans la STL
- test_ = test<toto>::check_presence; // vaut true car la méthode est définit dans le .h précédent!
- test_ = test<tata>::check_presence; // vaut false car pas de méthode définit
- return 0;
- }
|
Cdt,
|