Metaprg + String

Metaprg + String - C++ - Programmation

Marsh Posté le 25-02-2005 à 23:06:47    

Je bloque sur un pb de métaprog. Je cherche à initialiser une chaîne de caractères contenant la liste des nombres compris entre 0 et N séparés par des espaces. Il semblerait que seuls les types 'integral' soit manipulables. Donc pas de string.

Reply

Marsh Posté le 25-02-2005 à 23:06:47   

Reply

Marsh Posté le 26-02-2005 à 11:58:19    

le seul truc que tu peux faire, c'est manipuler des pointeurs, genre const char* ayant une visibilité extern

Reply

Marsh Posté le 26-02-2005 à 12:01:20    

j'avais pas lu le pseudo. Tu ferais peut être mieux de lire quelques uns de ces livres avant

Reply

Marsh Posté le 26-02-2005 à 12:55:50    

je regardre, merci.

Reply

Marsh Posté le 26-02-2005 à 23:32:59    

Stroustrup-Junior a écrit :

Je bloque sur un pb de métaprog. Je cherche à initialiser une chaîne de caractères contenant la liste des nombres compris entre 0 et N séparés par des espaces. Il semblerait que seuls les types 'integral' soit manipulables. Donc pas de string.


 

Code :
  1. #include <iostream>
  2. #include <sstream>
  3. #include <boost/mpl/range_c.hpp>
  4. #include <boost/mpl/for_each.hpp>
  5. namespace mpl = boost::mpl;
  6. namespace fab
  7. {
  8.     typedef mpl::range_c<int,2,8>::type seq_int;
  9.     struct concat
  10.     {
  11.     template <class T>
  12.     void operator()(T t)const
  13.     {
  14.                  ost << ' ' << T::value;
  15.         }
  16.     concat(std::ostringstream& os) : ost(os) {}
  17.     private:
  18.     std::ostringstream& ost;
  19.     };
  20. }//namespace fab
  21. int main()
  22.     std::ostringstream os;
  23.     fab::concat c(os);   
  24.     mpl::for_each<fab::seq_int>(c);   
  25.     std::cout << os.str() << '\n';
  26. }


 
un hybride meta/runtime, ça vaut ce que ça vaut, mais c'est du travail d'acrobate d'etre à la frontiere des deux mondes ... les spécialisations sont délicates :(

Reply

Marsh Posté le 27-02-2005 à 01:08:58    

Code :
  1. #include <boost/mpl/next.hpp>
  2. template <class T>
  3. struct seq : mpl::range_c<typename T::value_type,0,T::next::value>
  4. {};


 
à la place de seq_int, ce qui correspond mieux à la demande ...
pour l'utiliser :

Code :
  1. #include <boost/mpl/int.hpp>
  2. mpl::for_each<fab::seq<mpl::int_<7> > >(c);


Message édité par ++fab le 27-02-2005 à 01:12:08
Reply

Marsh Posté le 27-02-2005 à 12:19:53    

pourquoi vous utilisez pas tout simplement std::copy ?

Reply

Marsh Posté le 27-02-2005 à 12:57:36    

Taz a écrit :

pourquoi vous utilisez pas tout simplement std::copy ?


 :heink:  
copier quoi vers quoi ?
 

Reply

Marsh Posté le 27-02-2005 à 13:38:09    

ben ta concatenation

Reply

Marsh Posté le 27-02-2005 à 13:42:23    

Taz a écrit :

ben ta concatenation


 
seq_int a des iterateurs begin et end dans le méta-monde mais pas au runtime comme le demande std::copy. Ou alors, y a une façon de faire que j'ignore.

Reply

Marsh Posté le 27-02-2005 à 13:42:23   

Reply

Marsh Posté le 27-02-2005 à 13:44:25    

attend, je vois ptet ce que tu veux dire ...
EDIT: réécrire ça :  

Code :
  1. ost << ' ' << T::value;


en utilisant std::copy, moooouuuais bof


Message édité par ++fab le 27-02-2005 à 14:09:30
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed