8
votes

Utilisez Boost pour obtenir la rarité et les types de paramètres de la fonction Membre? (Boost :: Function_Traits)

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; }
};


0 commentaires

3 Réponses :


9
votes

Boost Fonction Types serait probablement la solution naturelle: xxx


6 commentaires

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;)



1
votes

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;
}


1 commentaires

intéressant et utile. BTW a besoin de #include



1
votes

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> xxx

sortie GCC:

m3barfiice

3

3bar, i

lisible humain

int (barre :: *) (int, char)

3

bar, int


0 commentaires