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