AccueilAccueil  FAQFAQ  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  
Le Deal du moment : -39%
Pack Home Cinéma Magnat Monitor : Ampli DENON ...
Voir le deal
1190 €

 

 Ablabla C++

Aller en bas 
+5
Mobi
Mass
D-z
Asu
onilink_
9 participants
Aller à la page : Précédent  1, 2
AuteurMessage
daminetreg
Administrateur
daminetreg


Messages : 16998
Localisation : Siege du CBNA!
Projet Actuel : Site Web du CBNA, version beta :

Ablabla C++ - Page 2 Empty
MessageSujet: Re: Ablabla C++   Ablabla C++ - Page 2 EmptyLun 15 Juin 2015 - 19:15

Bon après une longue absence je me lance. Smile

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
Le CBNA Tous Ensemble! Réalisons!
Ablabla C++ - Page 2 U3dfr2
Revenir en haut Aller en bas
http://lecbna.org/
daminetreg
Administrateur
daminetreg


Messages : 16998
Localisation : Siege du CBNA!
Projet Actuel : Site Web du CBNA, version beta :

Ablabla C++ - Page 2 Empty
MessageSujet: Re: Ablabla C++   Ablabla C++ - Page 2 EmptyMar 16 Juin 2015 - 23:29

J'ai pu l'améliorer : http://git.lecbna.org/toolsutilities/lib-cpp-enums/blob/master/parseEnums.cpp

Il est possible de transformer un enum en string ainsi :
Code:

SMART_ENUM(test, (

      enum class test { Oh, Yeah, Cool, }
))

Et ainsi d'accèder à leur valeur en tant que runtime string (générée à la compilation) avec :
Code:

enum_as_cstr<adapted_test, int(test::Cool)>::value

_________________
Mon CV : fr - de - en
Le CBNA Tous Ensemble! Réalisons!
Ablabla C++ - Page 2 U3dfr2
Revenir en haut Aller en bas
http://lecbna.org/
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

Ablabla C++ - Page 2 Empty
MessageSujet: Re: Ablabla C++   Ablabla C++ - Page 2 EmptyMer 17 Juin 2015 - 9:41

Sympa ça :b

_________________
Ablabla C++ - Page 2 Runningpotato1Ablabla C++ - Page 2 TvF6GED Ablabla C++ - Page 2 MdetltS
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

Ablabla C++ - Page 2 Empty
MessageSujet: Re: Ablabla C++   Ablabla C++ - Page 2 EmptyMar 29 Mar 2016 - 18:04

Un pattern de Signal/Slot a la Qt en C++11:
https://github.com/onidev/Signal-Slot

Trè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).

_________________
Ablabla C++ - Page 2 Runningpotato1Ablabla C++ - Page 2 TvF6GED Ablabla C++ - Page 2 MdetltS
Revenir en haut Aller en bas
Contenu sponsorisé





Ablabla C++ - Page 2 Empty
MessageSujet: Re: Ablabla C++   Ablabla C++ - Page 2 Empty

Revenir en haut Aller en bas
 
Ablabla C++
Revenir en haut 
Page 2 sur 2Aller à la page : Précédent  1, 2

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Programmation-
Sauter vers: