C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

preprocesseur : utilisation de ## et de «::»
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Fabien chêne
Guest





PostPosted: Thu Jun 29, 2006 6:08 am    Post subject: preprocesseur : utilisation de ## et de «::» Reply with quote



Bonsoir,

Est-il possible d'utiliser ## pour concaténer deux mots, dont le
deuxième est préfixé de «::» ?
Un exemple qui illustre ma question :

#define CAT( a, b ) a ## b

struct Foo
{
typedef int type;
};

template <class T>
CAT( typename T, ::type ) f( T )
{
CAT( typename T, ::type ) i = 2;
return i;
}

g++ rale et me dit que T:: type n'est pas un token de preprocessing
valide.

icc ne bronche pas. Est-ce légitime ? Même si ça ne l'est pas, y a
t'il une façon d'invoquer g++ pour obtenir un fonctionnement similaire
à icc ?

Merci.

--
Fab
Back to top
Frederic Lachasse
Guest





PostPosted: Thu Jun 29, 2006 7:30 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote



"Fabien chêne" <fabien.chene (AT) gmail (DOT) com> wrote in message
news:87veqkpy3u.fsf (AT) gmail (DOT) com...
Quote:

Bonsoir,

Est-il possible d'utiliser ## pour concaténer deux mots, dont le
deuxième est préfixé de «::» ?
Un exemple qui illustre ma question :

#define CAT( a, b ) a ## b

struct Foo
{
typedef int type;
};

template <class T
CAT( typename T, ::type ) f( T )
{
CAT( typename T, ::type ) i = 2;
return i;
}

g++ rale et me dit que T:: type n'est pas un token de preprocessing
valide.

icc ne bronche pas. Est-ce légitime ? Même si ça ne l'est pas, y a
t'il une façon d'invoquer g++ pour obtenir un fonctionnement similaire
à icc ?

La règle pour ## dans une macro est un peu bizarre... Le truc est de faire
la concaténation par une autre macro:
#define CAT2(a,b) a ## b
#define CAT(a,b) CAT2(a,b)

Pour l'explication du pourquoi, c'est un peu trop limite pour moi (et je
cherche à limiter la consommation d'aspirine...). La seule chose importante
pour moi est que le truc marche...

--
Frédéric Lachasse - ECP86
Back to top
Fabien LE LEZ
Guest





PostPosted: Thu Jun 29, 2006 9:11 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote



On Thu, 29 Jun 2006 03:08:37 +0200, fabien.chene (AT) gmail (DOT) com (Fabien
chêne):

Quote:
template <class T
CAT( typename T, ::type ) f( T )
{
CAT( typename T, ::type ) i = 2;

À quoi la macro sert-elle ici ?
Back to top
kanze
Guest





PostPosted: Thu Jun 29, 2006 9:11 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote

Fabien chêne wrote:

Quote:
Est-il possible d'utiliser ## pour concaténer deux mots, dont
le deuxième est préfixé de «::» ?

Qu'est-ce que tu entends par « mot » ? À l'intérieur du
langage, on parle plutôt des tokens. Et il n'existe pas de token
« préfixé de `::' » ; :: est un token en soi.

La règle de base de l'opérateur ##, c'est qu'il prend deux
tokens, pour en faire un. Formellement, les paramètres de
l'opérateur sont le token qui le précède et le token qui le
suit. Et le résultat doit être aussi un token légal. Sinon,
c'est un comportement indéfini.

Quote:
Un exemple qui illustre ma question :

#define CAT( a, b ) a ## b

struct Foo
{
typedef int type;
};

template <class T
CAT( typename T, ::type ) f( T )
{
CAT( typename T, ::type ) i = 2;
return i;
}

g++ rale et me dit que T:: type n'est pas un token de
preprocessing valide.

Il a raison. Tu as un comportement indéfini.

Quote:
icc ne bronche pas.

Il a raison. Ne pas broncher, c'est aussi un comportement permis
devant un programme qui a un comportement indéfini.

Quote:
Est-ce légitime ?

La norme l'interdit. Historiquement, la plupart des compilateurs
l'acceptaient.

Historiquement (c-à-d les implémentations de C d'il y a vingt
ans), le préprocesseur travaillait avec des chaînes de
caractères et les sous-chaînes. Le comité C a inventé ## pour
remplacer de diverses astuces (qui variait d'un compilateur à
l'autre) qui servait à concaténer des tokens ; des astuces qui
dépendaient sur le fait que le préprocesseur travaillait sur les
chaînes de caractères, et qui dépendaient en fait des
« accidents » dans l'implémentation du préprocesseur. (Donc,
avec certains préprocesseurs, ton CAT s'écrivait a/**/b ; avec
d'autres, on mettait a\ à la fin de ligne, et b au début de la
ligne suivante. Deux comportements qui se basaient sur des cas
que K&R n'avaient pas spécifié.) Au même temps, le comité a
voulu spécifier le préprocesseur de façon qu'il puisse être
implémenter en traitant des tokens directement. D'où la règle
que le résultat soit un token. (Note bien qu'au niveau du
préprocesseur, le compilateur doit bien garder
l'« orthographie » des tokens. Dans ton cas, par exemple,
CAT( &, x ) serait illégal, CAT( and, x ) légal, bien que
dans les deux cas, le préprocesseur a affaire aux mêmes tokens.
Mais il n'a besoin de régarder cette orthographie que dans les
cas rarissime.)

Dans la pratique, fort peu de compilateurs ont profité de cette
possibilité, et la quasi-totalité des préprocesseurs travaillent
toujours avec les chaînes de caractères directement, et
maintiennent les tokens en tant que chaîne, ne les évaluant
qu'après toute expansion du macro. Du coup, ## revient à un
opérateur de concatenation de chaîne, et ton exemple ne pose pas
de problème. Dans le cas de g++, je ne sais pas si c'est
l'exception, et qu'il travaille internalement en token, ou si
simplement ils ont ajouté un test explicit pour donner une
erreur à cause du comportement indéfini.

Note aussi que ce que constitue un token dépend du contexte. Si
l'expansion des macros se base sur des tokens, et non des
chaînes, il faut propager ce contexte dans l'expansion, pour
savoir interpréter des chose comme <xxx.h> (qui serait un seul
token après un #include, ou peut-être trois, selon
l'interprétation de §16.2/3, mais cinq n'importe où ailleurs).

Quote:
Même si ça ne l'est pas, y a t'il une façon d'invoquer g++
pour obtenir un fonctionnement similaire à icc ?

Étant donné que c'était aussi le comportement des anciens g++,
on s'y attendrait, n'est-ce pas ? Où que l'« erreur » ne soit
qu'un avertissement.

Toute fois est : je n'utiliserais pas de telles constructions
dans de nouveau code. L'intérêt d'une telle option dans g++, ça
serait uniquement de compiler du code ancien, pour qu'on ne soit
pas obligé à le modifier tout de suite. La construction est
illégale, et donc a évité. Et dans ton cas, je ne vois pas à
quoi il sert ; tu as une suite de tokens légaux qui font ce que
tu veux, tu n'as pas besoin de la concatenation.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Fabien Chêne
Guest





PostPosted: Thu Jun 29, 2006 9:11 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote

"Frederic Lachasse" <frederic.lachasse (AT) verizon (DOT) net> writes:

Quote:
La règle pour ## dans une macro est un peu bizarre... Le truc est de faire
la concaténation par une autre macro:
#define CAT2(a,b) a ## b
#define CAT(a,b) CAT2(a,b)

Oui, j'ai déjà essayé cette ruse.

Quote:
Pour l'explication du pourquoi, c'est un peu trop limite pour moi (et je
cherche à limiter la consommation d'aspirine...). La seule chose importante
pour moi est que le truc marche...

.... mais le truc ne marche pas hélas :/

--
Fab
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Thu Jun 29, 2006 9:11 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote

fabien.chene (AT) gmail (DOT) com (Fabien chêne) writes:

Quote:
Bonsoir,

Est-il possible d'utiliser ## pour concaténer deux mots, dont le
deuxième est préfixé de «::» ?
Un exemple qui illustre ma question :

#define CAT( a, b ) a ## b

struct Foo
{
typedef int type;
};

template <class T
CAT( typename T, ::type ) f( T )
{
CAT( typename T, ::type ) i = 2;
return i;
}

g++ rale et me dit que T:: type n'est pas un token de preprocessing
valide.

Il a raison.

Quote:
icc ne bronche pas. Est-ce légitime ?

Non.

Pourquoi ne pas faire

typename T :: type i = 2;

Il n'y a aucune raison d'essayer de concatener ces 4 tokens (typename,
T, ::, type) pour en faire un seul.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Back to top
Fabien LE LEZ
Guest





PostPosted: Fri Jun 30, 2006 1:19 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote

On Thu, 29 Jun 2006 23:25:22 +0200, fabien.chene (AT) gmail (DOT) com (Fabien
Chêne):

Quote:
(Donc,
avec certains préprocesseurs, ton CAT s'écrivait a/**/b ;

Ceci fonctionne

Il me semble qu'en C++, ça ne marche pas, car un commentaire est
considéré comme un séparateur.
Back to top
Fabien LE LEZ
Guest





PostPosted: Fri Jun 30, 2006 1:25 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote

On Thu, 29 Jun 2006 23:25:22 +0200, fabien.chene (AT) gmail (DOT) com (Fabien
Chêne):

Quote:
En gros, fabriquer une liste d'argument template à taille fixe, à
l'aide d'une macro, que je donne à manger à un boost::variant comme
ceci : boost::variant< MACRO_3( Foo, Bar, Baz ) > -- qui génère en
réalité boost::variant< Foo, Bar, Baz, none, none > si une certaine
macro vaut 5.

L'idée est maintenant de créer une macro pour, à partir de la liste
précédente, générer :

boost::variant< typename Foo::Type, typename Bar::Type, typename
Baz::Type, none, none

Je n'ai toujours pas saisi l'utilité de ##.

Je suppose que tu as une macro

#define MACRO_3( x, y, z) x, y, z, none, none

et tu veux rajouter une macro

#define MACRO_machin( x, y, z) \
MACRO_3 ( typename x::Type, typename y::Type, typename z::Type)



En pratique, ## ne sert que pour créer un identifiant (i.e. un "mot"
composé de lettres, chiffres et "_") à partir de deux identifiants.
Par exemple, pour créer "DEBUG_truc" à partir de "DEBUG_" et de
"truc".
Back to top
Fabien Chêne
Guest





PostPosted: Fri Jun 30, 2006 2:25 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote

"kanze" <kanze@gabi-soft.fr> writes:

Quote:
Fabien chêne wrote:

Est-il possible d'utiliser ## pour concaténer deux mots, dont
le deuxième est préfixé de «::» ?

Qu'est-ce que tu entends par « mot » ?

Justement ! J'ai employé « mot » pour ne pas dire token. Car je
n'étais pas sur que ça en soit un.

Quote:
À l'intérieur du langage, on parle plutôt des tokens. Et il n'existe
pas de token « préfixé de `::' » ; :: est un token en soi.

Je sais que :: est un token. Mais en quoi ::T, T:: n'en serait-il pas
un ? T::type en est bien un ?
Je sens que je vais recourrir à une feinte du père Lafeinte genre :
CAT( typename F, oo::type )
Mais j'aurais préféré ne pas en arriver là.


Quote:
g++ rale et me dit que T:: type n'est pas un token de
preprocessing valide.

Il a raison. Tu as un comportement indéfini.

icc ne bronche pas.

Il a raison. Ne pas broncher, c'est aussi un comportement permis
devant un programme qui a un comportement indéfini.

Est-ce légitime ?

La norme l'interdit.

J'aurais préféré que la norme l'autorise, ou déclare le programme
ill-formed. M'enfin. Aurais-tu une référence sur la norme à ce sujet ?

Quote:
Historiquement, la plupart des compilateurs
l'acceptaient.

Historiquement (c-à-d les implémentations de C d'il y a vingt
ans), le préprocesseur travaillait avec des chaînes de
caractères et les sous-chaînes. Le comité C a inventé ## pour
remplacer de diverses astuces (qui variait d'un compilateur à
l'autre) qui servait à concaténer des tokens ; des astuces qui
dépendaient sur le fait que le préprocesseur travaillait sur les
chaînes de caractères, et qui dépendaient en fait des
« accidents » dans l'implémentation du préprocesseur. (Donc,
avec certains préprocesseurs, ton CAT s'écrivait a/**/b ;

Ceci fonctionne \o/ J'avais complètement oublié ce hack. Quel en est
la portabilité, concrètement ?

Quote:
avec d'autres, on mettait a\ à la fin de ligne, et b au début de la
ligne suivante. Deux comportements qui se basaient sur des cas que
K&R n'avaient pas spécifié.) Au même temps, le comité a voulu
spécifier le préprocesseur de façon qu'il puisse être implémenter en
traitant des tokens directement. D'où la règle que le résultat soit
un token. (Note bien qu'au niveau du préprocesseur, le compilateur
doit bien garder l'« orthographie » des tokens. Dans ton cas, par
exemple, CAT( &, x ) serait illégal, CAT( and, x ) légal, bien que
dans les deux cas, le préprocesseur a affaire aux mêmes tokens.
Mais il n'a besoin de régarder cette orthographie que dans les cas
rarissime.)

Dans la pratique, fort peu de compilateurs ont profité de cette
possibilité, et la quasi-totalité des préprocesseurs travaillent
toujours avec les chaînes de caractères directement, et
maintiennent les tokens en tant que chaîne, ne les évaluant
qu'après toute expansion du macro. Du coup, ## revient à un
opérateur de concatenation de chaîne, et ton exemple ne pose pas
de problème. Dans le cas de g++, je ne sais pas si c'est
l'exception, et qu'il travaille internalement en token, ou si
simplement ils ont ajouté un test explicit pour donner une
erreur à cause du comportement indéfini.

Je crois que cela correspond à la politique de GCC que j'observe,
diagnostiquer les comportements indéfinis comme des erreurs à la
compilation.

Car on sent bien que cpp est sur le point de craquer, le résultat du
préprocessing est comme je m'y attends, mais il sort en erreur.


Quote:
Même si ça ne l'est pas, y a t'il une façon d'invoquer g++
pour obtenir un fonctionnement similaire à icc ?

Étant donné que c'était aussi le comportement des anciens g++,
on s'y attendrait, n'est-ce pas ?

Voui.

Quote:
Où que l'« erreur » ne soit qu'un avertissement.

La première idée que j'ai eu fut d'invoquer g++ -E -P
-traditional-cpp, mais curieusement, sans plus de succès.


Quote:
Toute fois est : je n'utiliserais pas de telles constructions
dans de nouveau code. L'intérêt d'une telle option dans g++, ça
serait uniquement de compiler du code ancien, pour qu'on ne soit
pas obligé à le modifier tout de suite. La construction est
illégale, et donc a évité.

Je pense que c'est raisonnable en effet.

Quote:
Et dans ton cas, je ne vois pas à quoi il sert ; tu as une suite de
tokens légaux qui font ce que tu veux, tu n'as pas besoin de la
concatenation.

Ce n'était qu'un exemple servant à cerner le problème. La réalité est
bien plus effrayante :-)

En gros, fabriquer une liste d'argument template à taille fixe, à
l'aide d'une macro, que je donne à manger à un boost::variant comme
ceci : boost::variant< MACRO_3( Foo, Bar, Baz ) > -- qui génère en
réalité boost::variant< Foo, Bar, Baz, none, none > si une certaine
macro vaut 5.

L'idée est maintenant de créer une macro pour, à partir de la liste
précédente, générer :

boost::variant< typename Foo::Type, typename Bar::Type, typename
Baz::Type, none, none >

C'est la que le problème des :: se pose ...


--
Fab




















Quote:
Fabien chêne wrote:

Est-il possible d'utiliser ## pour concaténer deux mots, dont
le deuxième est préfixé de «::» ?

Qu'est-ce que tu entends par « mot » ? À l'intérieur du
langage, on parle plutôt des tokens. Et il n'existe pas de token
« préfixé de `::' » ; :: est un token en soi.

La règle de base de l'opérateur ##, c'est qu'il prend deux
tokens, pour en faire un. Formellement, les paramètres de
l'opérateur sont le token qui le précède et le token qui le
suit. Et le résultat doit être aussi un token légal. Sinon,
c'est un comportement indéfini.

Un exemple qui illustre ma question :

#define CAT( a, b ) a ## b

struct Foo
{
typedef int type;
};

template <class T
CAT( typename T, ::type ) f( T )
{
CAT( typename T, ::type ) i = 2;
return i;
}

g++ rale et me dit que T:: type n'est pas un token de
preprocessing valide.

Il a raison. Tu as un comportement indéfini.

icc ne bronche pas.

Il a raison. Ne pas broncher, c'est aussi un comportement permis
devant un programme qui a un comportement indéfini.

Est-ce légitime ?

La norme l'interdit. Historiquement, la plupart des compilateurs
l'acceptaient.

Historiquement (c-à-d les implémentations de C d'il y a vingt
ans), le préprocesseur travaillait avec des chaînes de
caractères et les sous-chaînes. Le comité C a inventé ## pour
remplacer de diverses astuces (qui variait d'un compilateur à
l'autre) qui servait à concaténer des tokens ; des astuces qui
dépendaient sur le fait que le préprocesseur travaillait sur les
chaînes de caractères, et qui dépendaient en fait des
« accidents » dans l'implémentation du préprocesseur. (Donc,
avec certains préprocesseurs, ton CAT s'écrivait a/**/b ; avec
d'autres, on mettait a\ à la fin de ligne, et b au début de la
ligne suivante. Deux comportements qui se basaient sur des cas
que K&R n'avaient pas spécifié.) Au même temps, le comité a
voulu spécifier le préprocesseur de façon qu'il puisse être
implémenter en traitant des tokens directement. D'où la règle
que le résultat soit un token. (Note bien qu'au niveau du
préprocesseur, le compilateur doit bien garder
l'« orthographie » des tokens. Dans ton cas, par exemple,
CAT( &, x ) serait illégal, CAT( and, x ) légal, bien que
dans les deux cas, le préprocesseur a affaire aux mêmes tokens.
Mais il n'a besoin de régarder cette orthographie que dans les
cas rarissime.)

Dans la pratique, fort peu de compilateurs ont profité de cette
possibilité, et la quasi-totalité des préprocesseurs travaillent
toujours avec les chaînes de caractères directement, et
maintiennent les tokens en tant que chaîne, ne les évaluant
qu'après toute expansion du macro. Du coup, ## revient à un
opérateur de concatenation de chaîne, et ton exemple ne pose pas
de problème. Dans le cas de g++, je ne sais pas si c'est
l'exception, et qu'il travaille internalement en token, ou si
simplement ils ont ajouté un test explicit pour donner une
erreur à cause du comportement indéfini.

Note aussi que ce que constitue un token dépend du contexte. Si
l'expansion des macros se base sur des tokens, et non des
chaînes, il faut propager ce contexte dans l'expansion, pour
savoir interpréter des chose comme <xxx.h> (qui serait un seul
token après un #include, ou peut-être trois, selon
l'interprétation de §16.2/3, mais cinq n'importe où ailleurs).

Même si ça ne l'est pas, y a t'il une façon d'invoquer g++
pour obtenir un fonctionnement similaire à icc ?

Étant donné que c'était aussi le comportement des anciens g++,
on s'y attendrait, n'est-ce pas ? Où que l'« erreur » ne soit
qu'un avertissement.

Toute fois est : je n'utiliserais pas de telles constructions
dans de nouveau code. L'intérêt d'une telle option dans g++, ça
serait uniquement de compiler du code ancien, pour qu'on ne soit
pas obligé à le modifier tout de suite. La construction est
illégale, et donc a évité. Et dans ton cas, je ne vois pas à
quoi il sert ; tu as une suite de tokens légaux qui font ce que
tu veux, tu n'as pas besoin de la concatenation.

--
Fab
Back to top
Fabien Chêne
Guest





PostPosted: Fri Jun 30, 2006 2:27 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote

Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:

Quote:
On Thu, 29 Jun 2006 03:08:37 +0200, fabien.chene (AT) gmail (DOT) com (Fabien
chêne):

template <class T
CAT( typename T, ::type ) f( T )
{
CAT( typename T, ::type ) i = 2;

À quoi la macro sert-elle ici ?

A illustrer le problème, rien de plus. Voir ma réponse à James
pour le rapport avec le code réel.

--
Fab
Back to top
Fabien Chêne
Guest





PostPosted: Fri Jun 30, 2006 2:36 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote

Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> writes:

Quote:
fabien.chene (AT) gmail (DOT) com (Fabien chêne) writes:

Bonsoir,

Est-il possible d'utiliser ## pour concaténer deux mots, dont le
deuxième est préfixé de «::» ?
Un exemple qui illustre ma question :

#define CAT( a, b ) a ## b

struct Foo
{
typedef int type;
};

template <class T
CAT( typename T, ::type ) f( T )
{
CAT( typename T, ::type ) i = 2;
return i;
}

g++ rale et me dit que T:: type n'est pas un token de preprocessing
valide.

Il a raison.

icc ne bronche pas. Est-ce légitime ?

Non.

Quel dommage !

Quote:
Pourquoi ne pas faire

typename T :: type i = 2;

Il n'y a aucune raison d'essayer de concatener ces 4 tokens (typename,
T, ::, type) pour en faire un seul.

En réalité, ce sont les 2 tokens centraux qui sont concaténés (T, :Smile,
mais apparemment, cela ne produit pas un token valide (?)

Pour la raison, voir ma réponse à James -- bien que peu détaillée.

--
Fab
Back to top
Olivier Miakinen
Guest





PostPosted: Fri Jun 30, 2006 3:15 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote

Le 29/06/2006 03:08, Fabien chêne a écrit :
Quote:
Un exemple qui illustre ma question :

#define CAT( a, b ) a ## b

[...]
CAT( typename T, ::type ) f( T )
{
CAT( typename T, ::type ) i = 2;
return i;
}

g++ rale et me dit que T:: type n'est pas un token de preprocessing
valide.

Tu pourrais essayer avec :
#define CAT( a, b ) a b

;-)
Back to top
Fabien LE LEZ
Guest





PostPosted: Fri Jun 30, 2006 4:34 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote

On Fri, 30 Jun 2006 03:30:53 +0200, fabien.chene (AT) gmail (DOT) com (Fabien
Chêne):

Quote:
Mais je soupsonne Boost.Preprocessor
de le faire rien que pour m'embêter Sad

Dans ce cas, c'est soit une mauvaise utilisation de boost, soit un bug
qu'il faut leur remonter.
Back to top
Fabien Chêne
Guest





PostPosted: Fri Jun 30, 2006 6:30 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote

Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:

Quote:
On Thu, 29 Jun 2006 23:25:22 +0200, fabien.chene (AT) gmail (DOT) com (Fabien
Chêne):

En gros, fabriquer une liste d'argument template à taille fixe, à
l'aide d'une macro, que je donne à manger à un boost::variant comme
ceci : boost::variant< MACRO_3( Foo, Bar, Baz ) > -- qui génère en
réalité boost::variant< Foo, Bar, Baz, none, none > si une certaine
macro vaut 5.

L'idée est maintenant de créer une macro pour, à partir de la liste
précédente, générer :

boost::variant< typename Foo::Type, typename Bar::Type, typename
Baz::Type, none, none

Je n'ai toujours pas saisi l'utilité de ##.

Je ne l'utilise pas directement. Mais je soupsonne Boost.Preprocessor
de le faire rien que pour m'embêter :-(

Quote:
Je suppose que tu as une macro

#define MACRO_3( x, y, z) x, y, z, none, none

C'est un peu plus complexe, pour prendre en compte les contraintes des
variants, mais ça revient à peu près à ça.

Quote:
et tu veux rajouter une macro

#define MACRO_machin( x, y, z) \
MACRO_3 ( typename x::Type, typename y::Type, typename z::Type)

En fait, c'est soi je réécris une macro spéciale pour cela, soit je
transforme la première via Boost.Preprocessor. La deuxième solution
est souple et bien plus élégante, mais elle ne doit pas devenir non
portable pour autant.


--
Fab
Back to top
Fabien Chêne
Guest





PostPosted: Fri Jun 30, 2006 6:42 am    Post subject: Re: preprocesseur : utilisation de ## et de «::» Reply with quote

Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:

Quote:
On Fri, 30 Jun 2006 03:30:53 +0200, fabien.chene (AT) gmail (DOT) com (Fabien
Chêne):

Mais je soupsonne Boost.Preprocessor
de le faire rien que pour m'embêter :-(

Dans ce cas, c'est soit une mauvaise utilisation de boost, soit un bug
qu'il faut leur remonter.

Réflexion faite, BOOST_PP_LIST_FOR_EACH doit répondre à mon besoin. Si
je lui passe en paramètre une macro de concaténation toute bête :

#define CAT( a, b ) a b

Merci.

--
Fab
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.