2016-03-14 2 views
0

J'essaie de construire un petit exemple C++ en utilisant boost fusion. Toutefois, Visual Studio 2013 me donne des erreurs de construction pour le morceau de code suivant. Il faut tout simplement aller sur une struct associative et imprimer tous les noms de membres à la console:Boost fusion en utilisant transform dans for_each

#include <iostream> 
#include <type_traits> 
#include <boost/fusion/adapted/struct/define_assoc_struct.hpp> 
#include <boost/fusion/algorithm/iteration/for_each.hpp> 
#include <boost/fusion/algorithm/transformation/zip.hpp> 
#include <boost/fusion/algorithm/transformation/transform.hpp> 

namespace keys 
{ 
    struct name 
    {}; 
    struct id 
    {}; 
} 

BOOST_FUSION_DEFINE_ASSOC_STRUCT((), Student, 
    (std::string, name, keys::name) 
    (int, id, keys::id) 
); 

struct getnames 
{ 
    template<typename Sig> 
    struct result; 

    template <typename S, typename T> 
    struct result<getnames(S, T)> 
    { 
     typedef std::string type; 
    }; 

    template<class Struct, class N> 
    typename result<getnames(Struct, N)>::type operator() (const N& i) const 
    { 
     return boost::fusion::extension::struct_member_name<Struct, i>::call(); 
    } 
}; 

struct print 
{ 
    template<typename Sig> 
    struct result; 

    template <typename T> 
    struct result<print(T)> 
    { 
     typedef void type; 
    }; 

    template<class S> 
    void operator() (const S& i) const 
    { 
     std::cout << i << std::endl; 
    }; 
}; 

int main() 
{ 
    Student j = {"John", 42}; 
    auto names = boost::fusion::transform(j, getnames()); 
    boost::fusion::for_each(names, print()); 
    return 0; 
} 

Ceci est mon erreur:
boost/fusion/view/transform_view/detail/deref_impl.hpp(38): error C2039: 'type' : is not a member of 'boost::mpl::apply<boost::fusion::detail::apply_transform_result<getnames>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>' et quatre autres erreurs qui viennent à cause de la première.

Pour être honnête, je ne suis pas un expert dans l'utilisation de boost fusion alors peut-être que j'ai simplement raté quelque chose d'important ici et quelqu'un d'autre peut m'aider.

Répondre

1

Votre code présente plusieurs problèmes.

1) Dans le Functor getnames, la signature du type result et la signature de operator() sont incohérentes (l'une prend un argument, l'autre en prend deux). 2) dans le operator()(const N& i), i est une variable d'exécution. Il ne peut pas apparaître en tant que paramètre de modèle dans l'expression boost::fusion::extension::struct_member_name<Struct, i>. Je ne sais pas comment aider sans savoir ce que vous voulez faire avec getnames. Essayez d'obtenir un code cohérent en premier.

+0

Si 'N' est un' integral_constant'', je peux [être utilisé comme paramètre de modèle] (http://stackoverflow.com/questions/17835689/accessing-boost-fusion-map-field-name/17842958 # 17842958) avec clang et g ++. Je soupçonne que le demandeur a essayé de copier le code de quelque part et a oublié une partie importante. – llonesmiz

+0

Je pense que «je» ne peut pas apparaître comme un paramètre de température dans le corps de la fonction. Ce n'est pas un type, c'est une variable, même si c'est un entier ce n'est pas un constexpr. – alfC

+0

Je ne suis pas un juriste en langues, donc je ne sais pas si c'est un bug à la fois [g ++] (http://coliru.stacked-crooked.com/a/0ad9a8a84483d66f) et [clang] (http: // coliru.stacked-crooked.com/a/a4cc487d70b29afe). Dans [Visual Studio] (http://rextester.com/LPRN14803), cela ne fonctionne pas. – llonesmiz