Cela fonctionne très bien, pour les fonctions de vanille ordinaire. Le code ci-dessous fonctionne juste bien. Il imprime juste ce qui devrait:
struct bar { int foo(int, char) { return 0; } };
3 Réponses :
Boost Fonction Types serait probablement la solution naturelle:
Croyez-moi, j'ai essayé chaque variante avec Boost_Typeof (& Bar :: FOO) que je peux penser. J'espère que quelqu'un peut poster un petit programme de travail, comme celui de la question.
La plupart des gens font. J'ai été programmeur professionnel depuis 1971 et j'ai appris que cela ne peut pas nuire à l'épeler les choses. Merci de votre aide.
@Jive, pas de problème, je n'obtiens rien de toute façon - bien que cela me donnait une tendance à essayer de faire cette nouvelle bibliothèque de réflexion C ++;
@Kornel, vous devez admettre que c'est assez obscur. Mon rêve est un ++ C ++ c'est ce que C ++ serait si Bjarne savait alors ce qu'il sait maintenant. Sans l'exigence que C ++ soit un superset de C, une exigence qui a été abandonnée, toutes les options seraient ouvertes. D'une part, l'introspection de la compilation ne devrait pas être faite par des hacks avec des constructions de modèle. J'ai des idées, mais que je plaisante? C'est une dernière chose que je ne ferai jamais.
@Jive, oui je vais l'admettre. Et oui, je rêverais que C ++ a finalement abandonné la compatibilité à l'arrière à C ++ -_-. Si vous voulez une langue ++ C ++, essayez D.
@Jive - BTW, accepte la réponse si vous y êtes satisfait;)
Kornel Kisielewicz cloué. Ici, c'est avec la solution séparée des messages de test.
#include <boost/function_types/function_type.hpp> #include <boost/function_types/parameter_types.hpp> #include <boost/function_types/function_arity.hpp> #include <boost/typeof/std/utility.hpp> #include <iostream> struct bar { int foo(int, char) { return 0; } }; int main() { typedef BOOST_TYPEOF(&bar::foo) foo_type; int arity = boost::function_types::function_arity<foo_type>::value; typedef boost::mpl::at_c<boost::function_types::parameter_types<foo_type>,1>::type arg1; typedef boost::mpl::at_c<boost::function_types::parameter_types<foo_type>,2>::type arg2; std::cout << typeid(foo_type).name() << std::endl; std::cout << arity << std::endl; std::cout << typeid(arg1).name() << ","; std::cout << typeid(arg2).name() << std::endl; return 0; }
intéressant et utile. BTW a besoin de #include
Ceci peut être fait avec de nouveau boost lib (traits appelables, bonus: cela fonctionne avec Lambdas également).
J'ai également ajouté l'impression d'une autre impression avec une sortie lisible humaine, bien que la question ne soit pas sûre de la demander. < / p> sortie GCC: p> m3barfiice p>
3 p>
3bar, i p>
lisible humain p>
int (barre :: *) (int, char) p>
3 p>
bar, int p>
blockQuote> p>