daminetreg Administrateur
Messages : 16998 Localisation : Siege du CBNA! Projet Actuel : Site Web du CBNA, version beta :
| Sujet: Re: Ablabla C++ Lun 15 Juin 2015 - 19:15 | |
| Bon après une longue absence je me lance. J'ai joué la semaine dernière avec cette magnifique librarie nommée metaparse. Et j'ai produit l'ébauche d'un générateur de données de réflexion pour transformer un enum en string. Je travaille dessus pour en faire une lib propre, mais voici l'idée : - Code:
-
#include <iostream>
#include <mpllibs/metaparse/string.hpp> #include <mpllibs/metaparse/lit_c.hpp> #include <mpllibs/metaparse/sequence.hpp>
#include <mpllibs/metaparse/entire_input.hpp> #include <mpllibs/metaparse/token.hpp> #include <mpllibs/metaparse/build_parser.hpp>
#include <mpllibs/metaparse/foldl.hpp> #include <mpllibs/metaparse/any.hpp>
#include <mpllibs/metaparse/one_char_except.hpp> #include <mpllibs/metaparse/empty.hpp>
#include <mpllibs/metaparse/one_of.hpp>
#include <mpllibs/metaparse/transform.hpp>
#include <boost/mpl/size.hpp> #include <boost/mpl/at.hpp> #include <boost/mpl/int.hpp>
#include <boost/mpl/lambda.hpp> #include <boost/mpl/plus.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/string.hpp>
using namespace mpllibs::metaparse;
using enum_sequence = sequence<lit_c<'e'>,lit_c<'n'>,lit_c<'u'>,lit_c<'m'>>; using enumeration_ids = sequence< token<lit_c<'{'>>, any< sequence< token<any<one_char_except<std::integral_constant<char, ','>>>>, token<lit_c<','>> > >, token<lit_c<'}'>> >;
using enum_parser = build_parser< entire_input< sequence< token<enum_sequence>, enumeration_ids > > >;
enum class test { first, second, third };
using parsed = enum_parser::apply<MPLLIBS_STRING("enum { first, second, third, }")>::type;
using get_enum_entry_count = boost::mpl::size< boost::mpl::at_c< boost::mpl::at_c<parsed, 1>::type, 1 >::type>::type;
template <int x> using get_enum_entry = typename boost::mpl::at_c< typename boost::mpl::at_c< boost::mpl::at_c< boost::mpl::at_c<parsed, 1>::type, 1 >::type, x >::type, 0>::type;
template <int x> using enum_strval = typename boost::mpl::fold< typename get_enum_entry< x >::type, boost::mpl::string<>::type, boost::mpl::lambda< boost::mpl::push_back<boost::mpl::_1, boost::mpl::_2> >::type >::type;
int main(int argc, const char** argv) { using namespace boost::mpl;
std::cout << "There are " << get_enum_entry_count::value << " identifiers. " << std::endl;
std::cout << "Enum as string is " << c_str< enum_strval<int(test::first)> >::type::value << std::endl; std::cout << "Enum as string is " << c_str< enum_strval<int(test::second)> >::type::value << std::endl; std::cout << "Enum as string is " << c_str< enum_strval<int(test::third)> >::type::value << std::endl;
return 0; }
Pour un enum donné on pourra récupérer une string pour chacune de ses valeurs et vice-versa : - Code:
-
enum class test { first, second, third }; std::cout << "There are " << get_enum_entry_count<test>::value << " identifiers. " << std::endl; std::cout << "Enum as string is " << c_str< enum_strval<int(test::first)> >::type::value << std::endl; std::cout << "Enum as string is " << c_str< enum_strval<int(test::second)> >::type::value << std::endl; std::cout << "Enum as string is " << c_str< enum_strval<int(test::third)> >::type::value << std::endl;
Cela ouput : - Code:
-
daminetreg@daminetreg-laptop:~/workspace/experiments/parseEnums$ ./parseEnum There are 3 identifiers. Enum as string is first Enum as string is second Enum as string is third
_________________ Mon CV : fr - de - en Tous Ensemble! Réalisons! |
|
daminetreg Administrateur
Messages : 16998 Localisation : Siege du CBNA! Projet Actuel : Site Web du CBNA, version beta :
| Sujet: Re: Ablabla C++ Mar 16 Juin 2015 - 23:29 | |
| _________________ Mon CV : fr - de - en Tous Ensemble! Réalisons! |
|
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Ablabla C++ Mer 17 Juin 2015 - 9:41 | |
| |
|
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Ablabla C++ Mar 29 Mar 2016 - 18:04 | |
| Un pattern de Signal/Slot a la Qt en C++11: https://github.com/onidev/Signal-SlotTrès utile quand il s'agit de faire de la GUI, ou bien pratique pour gérer certains types d'events dans une API (par ex une API network qui doit indiquer quand un client se co/deco). |
|