2016-02-02 3 views
0

J'utilise la bibliothèque de fusion boost pour lire tous les membres d'une structure. Je crois que boost::fusion::extension::struct_member_name<MembersList, Index::value>::call() donne déjà le nom du membre. Mais existe-t-il un moyen d'obtenir le nom en dehors de cette structure sans avoir besoin de passer un autre paramètre à la fonction autre que member_value?Comment obtenir le nom de membre de l'élément spécifique en utilisant boost fusion

template <typename MembersList> 
struct Struct 
{ 
    Struct(const MembersList& members) : mMembers(members) 
    { 
    } 

    template <typename Index> 
    void operator() (Index idx) const 
    { 
     std::string field_name = boost::fusion::extension::struct_member_name<MembersList, Index::value>::call(); 
     const auto& member_value = boost::fusion::at<Index>(mMembers); 

     getName(member_value); // function that returns the name of member_value 
    } 
}; 

Disons que le struct nous traitons est défini comme ci-dessous et je pourrais vous avoir la fonction getName pour retourner une chaîne soit « valeur » « nom » ou.

BOOST_FUSION_DEFINE_STRUCT(
    (NameSpace), 
    Members, 
    (string, name) 
    (int, value) 
    ) 

Edit:

Est-il possible que je pourrais mettre en place la structure que je peux accéder à la variable field_name extérieur? Peut-être avoir quelque chose comme

template <typename MembersList> 
struct Struct 
{ 
    std::string field_name; 

    template <typename Index> 
    void operator() (Index idx) const 
    { 
     field_name = boost::fusion::extension::struct_member_name<MembersList, Index::value>::call(); 
    } 

    std::string getName(){ 
     return field_name; 
    } 
}; 

void someFunction() { 
    std::string name = getName(); 
} 

Mais au bon format?

Merci!

Répondre

1

Il n'y a pas de telle manière

Un objet membre est juste un objet. Une fois que vous le passez, c'est juste un int& ou un std::string&. Il n'y a pas de contexte pour en déduire que c'est un membre d'un objet différent.

Bien sûr, ssi vous savez l'objet englobante vous pouvez itérer tous les membres de la fusion adaptée et comparer les adresses à l'adresse du sous-objet member_value Je ne sais pas pourquoi vous voudriez que, mais là vous allez .

+0

Je m'attends à recevoir une réponse solide maintenant que cela n'a pas été accepté :) Vous pouvez faire _it_ comme je l'ai esquissé, mais je ne répondrais pas à la question, _neither_ suis-je d'humeur à l'implémenter? – sehe

+0

quelque chose de vraiment simple et direct. Comme il n'y a pas d'autres réponses, je suppose qu'il n'y a pas de solution simple à cela, alors j'ai accepté de nouveau votre réponse. Merci. – XTT