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 

Conditions sur des paramètres templates
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Yohan
Guest





PostPosted: Wed Feb 22, 2006 1:06 am    Post subject: Conditions sur des paramètres templates Reply with quote



Bonjour,

J'ai une question concernant les paramètres des classes templates.
Est-ce possible de déclarer une condition à remplir pour qu'un template
soit instancié (ou non)au moment de la compilation ?
(et donc que cette condition non remplie enverrait une erreur au
compilateur par exemple)
Et est-ce possible d'utiliser le même type de condition pour choisir
quel méthode le compilateur devra compiler.

L'exemple suivant illustre ma première question:
la condition serait "la variable nb est supérieure à 1"


template < class T, int nb >
class Foo
{
private:

T _tab[nb];

public:

Foo(T[nb]);

...

}


typedef Foo<float,2> Coord; // cette ligne doit pouvoir compiler

typedef Foo<int,3> Example; // cette ligne aussi

typedef Foo<float,0> Another; // mais j'aimerai que cette ligne
envoieune erreur au compilo


// Cet exemple concernait ma première question
Ma deuxième question concerne une condition qui permettrait au
compilateur de necompiler que certaines méthodes.
Le choix se fesant à la compilation...

Par exemple, le cas d'un nombre de paramètre variable avant comilation,
mais fixe après comilation:
Ce qui suit illustre la question:

template < class T, int nb >
class Foo2
{
private:

T _tab[nb];

public:

#if( nb==1 )
Foo(T t1);

#else if (nb==2)
Foo(T t1, T t2);

#else if....

...

}


// bien sur, la syntaxe est fausse, car le précompilateur ne connait pas
lavariable nb.
Donc mon idée aurait été de trouver une forme de condition sur les
variables template, évaluée au moment de la compilation.

Si vous avez uneidée, elle pourrait m'être très précieuse !

Merci


Yohan Firmy
Back to top
Fabien LE LEZ
Guest





PostPosted: Wed Feb 22, 2006 3:06 am    Post subject: Re: Conditions sur des paramètres templates Reply with quote



On Wed, 22 Feb 2006 01:49:37 +0100, Yohan <yohan.3 (AT) gmail (DOT) com>:

Quote:
Est-ce possible de déclarer une condition à remplir pour qu'un template
soit instancié (ou non)au moment de la compilation ?

Il est possible que ceci réponde à ta question :
<http://www.google.com/search?&q=boost%20static_assert>
Back to top
Franck Branjonneau
Guest





PostPosted: Wed Feb 22, 2006 12:06 pm    Post subject: Re: Conditions sur des paramètres templates Reply with quote



Yohan <yohan.3 (AT) gmail (DOT) com> écrivait:

Quote:
J'ai une question concernant les paramètres des classes templates.
Est-ce possible de déclarer une condition à remplir pour qu'un
template soit instancié (ou non)au moment de la compilation ?

Ta question est mal posée.

Quote:
Et est-ce possible d'utiliser le même type de condition pour choisir
quel méthode le compilateur devra compiler.

Cette question n'a pas de sens.

Quote:
L'exemple suivant illustre ma première question:
la condition serait "la variable nb est supérieure à 1"

[ Je lis supérieure ou égale à 1 ]

Quote:
template < class T, int nb
class Foo
{
private:

T _tab[nb];

S'interdire l'usage de _ en premier caractère d'un identificateur.

Quote:
public:

Foo(T[nb]);

Vraiment ?

Quote:

...

}

Manque un point-virgule.

Quelque chose comme ça doit convenir :

template < class T, int nb, bool /* ensure nb >= 1 */ nb < 1 >
class Foo;

// Not defined, nb < 1 is true.
template<>
template < class T, int nb >
class Foo< T, nb, true >;


template<>
template < class T, int nb >
class Foo< T, nb, false > {

// Ok, nb >= 1.

};

Quote:
typedef Foo<float,0> Another; // mais j'aimerai que cette ligne
envoieune erreur au compilo

Envoyer une erreur au compilateur ? Cette ligne provoqueras une erreur
de compilation et un diagnostic.

Quote:
Ma deuxième question concerne une condition qui permettrait au
compilateur de necompiler que certaines méthodes.

Méthode ?

Quote:
Le choix se fesant à la compilation...

Par exemple, le cas d'un nombre de paramètre variable avant
comilation, mais fixe après comilation:

Ce n'est pas évident. Voire du côté des tuples de boost ou tr1
peut-être.

Quote:
Ce qui suit illustre la question:

template < class T, int nb
class Foo2
{
private:

T _tab[nb];
^

Non !
Quote:

public:

#if( nb==1 )
Foo(T t1);
^

2
Quote:

#else if (nb==2)
Foo(T t1, T t2);
^

2
Quote:

#else if....

...

}
^

;

Si le domaine de nombre est petit ou si le nombre de fonctions
concernées est petit il est possible de le faire « à la main ».

--
Franck Branjonneau
Back to top
meow
Guest





PostPosted: Thu Feb 23, 2006 11:06 am    Post subject: Re: Conditions sur des paramètres templates Reply with quote

Quote:
S'interdire l'usage de _ en premier caractère d'un identificateur.
pourquoi ?
Back to top
Franck Branjonneau
Guest





PostPosted: Thu Feb 23, 2006 6:06 pm    Post subject: Re: Conditions sur des paramètres templates Reply with quote

"meow" <schwarz.ben (AT) gmail (DOT) com> écrivait:

Quote:
S'interdire l'usage de _ en premier caractère d'un identificateur.
pourquoi ?

Les noms commençant par _ sont réservés à l'implémentation.

--
Franck Branjonneau
Back to top
Fabien LE LEZ
Guest





PostPosted: Thu Feb 23, 2006 7:06 pm    Post subject: Re: Conditions sur des paramètres templates Reply with quote

On Thu, 23 Feb 2006 18:32:45 +0100, Franck Branjonneau
<fasbjx (AT) free (DOT) fr>:

Quote:
Les noms commençant par _ sont réservés à l'implémentation.

À l'implémentation de la bibliothèque standard.
Back to top
Fabien LE LEZ
Guest





PostPosted: Thu Feb 23, 2006 7:06 pm    Post subject: Re: Conditions sur des paramètres templates Reply with quote

On Thu, 23 Feb 2006 18:32:45 +0100, Franck Branjonneau
<fasbjx (AT) free (DOT) fr>:

Quote:
S'interdire l'usage de _ en premier caractère d'un identificateur.
pourquoi ?

Les noms commençant par _ sont réservés à l'implémentation.

En fait, pas tous -- mais c'est effectivement plus simple de
s'interdire tous les noms commençant par "_", ou contenant "__".

En théorie, on pourrait les utiliser comme membres d'une classe ; mais
en pratique, avec tous les #define qui traînent dans les headers,
c'est dangereux.

Note que s'interdire les noms commençant par "_" ne règle pas tous les
problèmes. Cf <http://www.gotw.ca/gotw/063.htm>.
Back to top
Franck Branjonneau
Guest





PostPosted: Thu Feb 23, 2006 8:06 pm    Post subject: Re: Conditions sur des paramètres templates Reply with quote

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

Quote:
On Thu, 23 Feb 2006 18:32:45 +0100, Franck Branjonneau
fasbjx (AT) free (DOT) fr>:

Les noms commençant par _ sont réservés à l'implémentation.

À l'implémentation de la bibliothèque standard.

Non, à l'implémentation (17.4.3.1.2).

--
Franck Branjonneau
Back to top
meow
Guest





PostPosted: Fri Feb 24, 2006 3:06 pm    Post subject: Re: Conditions sur des paramètres templates Reply with quote

J'avoue que j'attendais vaguement une réponse du type de celle de
Fabien...

Celle là :
Quote:
Non, à l'implémentation (17.4.3.1.2).
je la comprend moins ,O_o

qu'est-ce qu'on entend exactement par "l'implémentation" ?

Vu que je ne savais pas où chercher j'ai demandé à mon ami google
qui m'a donné quelques logs et forums dont je recopie ci dessous la
partie intéressante. Si donc j'ai bien compris, la norme (laquelle ?)
demande aux programmeurs C++ de n'utiliser les noms du genre "_miaou"
que dans le namespace global ou dans le namespace std:: (et une
classe... c'est considéré comme un namespace ?)

pour les noms du type "__miaou" ou "_Miaou" ils disent comme toi que
c'est "reservé à l'implémentation"... O_o
L'implémentation de quoi de qui ? Y manque rien dans cette phrase ?
Help !!!

17.4.3.1.2 of the Standard:
Certain sets of names and function signatures are always reserved to
the
implementation:
- Each name that contains a double underscore (_ _) or begins with an
underscore followed by an uppercase letter (2.11) is reserved to the
implementation for any use.
- Each name that begins with an underscore is reserved to the
implementation
for use as a name in the global namespace.165) Such names are also
reserved in namespace ::std (17.4.3.1).
Back to top
James Kanze
Guest





PostPosted: Sat Feb 25, 2006 3:06 pm    Post subject: Re: Conditions sur des paramètres templates Reply with quote

meow wrote:
Quote:
J'avoue que j'attendais vaguement une réponse du type de celle de
Fabien...

Celle là :
Non, à l'implémentation (17.4.3.1.2).

je la comprend moins ,O_o qu'est-ce qu'on entend exactement par
"l'implémentation" ?

Ce qui est fourni par le compilateur. En général, il faut
entendre aussi le système d'exploitation, parce que le
compilateur (avec sa bibliothèque) en dépend.

Dans la pratique, il y a aussi parfois des logiciels tiers qui
en font partie aussi, mais strictement parlant, de point de vue
de la norme C++, ce sont des logiciels utilisateur exactement
comme le code que tu écris toi-même.

Quote:
Vu que je ne savais pas où chercher j'ai demandé à mon ami
google qui m'a donné quelques logs et forums dont je recopie
ci dessous la partie intéressante. Si donc j'ai bien compris,
la norme (laquelle ?) demande aux programmeurs C++ de
n'utiliser les noms du genre "_miaou" que dans le namespace
global ou dans le namespace std:: (et une classe... c'est
considéré comme un namespace ?)

La norme, en l'occurance, c'est ISO 14882. La norme du langage
de programmation C++.

Et je crois que tu as compris à travers. Selon la norme, les
noms du genre « _miaou » sont reservés à l'implémentation au
niveau global -- tu peux théoriquement t'en servir comme membre
de classe, mais pas comme variable globale.

(Je dis théoriquement, parce que dans la pratique, ils posent
parfois des problèmes aussi comme membre de classe.)

Quote:
pour les noms du type "__miaou" ou "_Miaou" ils disent comme
toi que c'est "reservé à l'implémentation"... O_o
L'implémentation de quoi de qui ?

L'implémentation du compilateur dont tu te sers, y compris tout
ce dont il dépend.

Quote:
Y manque rien dans cette phrase ? Help !!!

C'est du « standardais » -- un dialect d'anglais un peu
particulier. En « standardais » (« standardois » ?
« standardien » ? -- « standardese » en anglais),
l'implémentation, c'est toujours l'implémentation de la norme,
c-à-d dans le cas d'une norme d'un langage du programmation, le
compilateur et l'environement qu'il fournit.

Quote:
17.4.3.1.2 of the Standard:
Certain sets of names and function signatures are always
reserved to the implementation:
- Each name that contains a double underscore (_ _) or begins
with an underscore followed by an uppercase letter (2.11) is
reserved to the implementation for any use.

Surtout, en ce qui concerne le C++, une implémentation a droit
de définir des macros avec de tels noms. Alors, si tu t'en sers,
et l'implémentation a un macro prédéfini du même nom...

Quote:
- Each name that begins with an underscore is reserved to the
implementation for use as a name in the global namespace.165)
Such names are also reserved in namespace ::std (17.4.3.1).

Ce qui exclut les macros (qui ne sont dans aucun espace
référentiel, mais qui vit dans un monde à part). C'est donc si
tu l'utilises dans espace référentiel global, tu risques des
conflits dans la définition, mais si tu t'en sers dans une
classe, ta définition cache celle de l'implémentation, ce qui ne
pose pas de problèmes.


Ça, c'est pour la théorie. Dans la pratique, ce n'est par rare
que l'implémentation comporte au moin un macro avec un nom du
genre « _miaou » (bien que la situation s'améliore nettement par
rapport au passé). Et ça, c'est dans le mode « compatible » ;
bien souvent, on veut aussi une compatibilité avec d'autres
normes aussi (Posix par exemple). Si je régarde Sun CC, par
exemple (ou g++ sous Solaris, je crois), en mode strictement
conforme, il n'y a pas de nom du genre « _miaou ». En
revanche, en mode strictement conforme, il n'y a ni de
threads ni de sockets non plus. Et dès que je passe en une mode
avec threads ou sockets, j'ai aussi quelques macros du genre
« _miaou ». Sous Linux, c'est pire -- dès que je sors du mode
conforme, j'ai un macro du nom « linux » (qui m'ennuie pas mal,
parce que j'ai un répertoire avec les en-têtes qui s'appelle
linux, et « #include "gb/syst/linux/xxx.hh" » ne marche pas très
bien quand tu remplaces linux avec 1).

--
James Kanze kanze.james (AT) neuf (DOT) fr
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 LE LEZ
Guest





PostPosted: Sat Feb 25, 2006 10:06 pm    Post subject: Re: Conditions sur des paramètres templates Reply with quote

On Sat, 25 Feb 2006 15:49:11 +0100, James Kanze <kanze.james (AT) neuf (DOT) fr>:

Quote:
j'ai un macro du nom « linux » (qui m'ennuie pas mal,
parce que j'ai un répertoire avec les en-têtes qui s'appelle
linux, et « #include "gb/syst/linux/xxx.hh" » ne marche pas très
bien quand tu remplaces linux avec 1).

Comment t'en sors-tu dans ce cas ? Tu renommes le répertoire en
"Linux" ?
Back to top
James Kanze
Guest





PostPosted: Sun Feb 26, 2006 4:57 pm    Post subject: Re: Conditions sur des paramètres templates Reply with quote

Fabien LE LEZ wrote:
Quote:
On Sat, 25 Feb 2006 15:49:11 +0100, James Kanze <kanze.james (AT) neuf (DOT) fr>:

j'ai un macro du nom « linux » (qui m'ennuie pas mal, parce
que j'ai un répertoire avec les en-têtes qui s'appelle linux,
et « #include "gb/syst/linux/xxx.hh" » ne marche pas très
bien quand tu remplaces linux avec 1).

Comment t'en sors-tu dans ce cas ? Tu renommes le répertoire
en "Linux" ?

Pour l'instant, je compile avec -std=c++98. C-à-d que je démande
au compilateur de se comporter de façon conforme à la norme. Ce
qu'il fait.

Mais je reflechis sur une solution plus adéquate. Parce que
j'imagine que s'ils définissent linux par défaut, il y a bien
une raison. Et qu'il se peut qu'il y a des logiciels tiers qui
s'y compte.

En fait, les noms des répertoires ici suivent une convention que
j'ai établi il y a très longtemps, sous MS-DOS. J'ai donc une
hiérarchie : dans le makefile, c'est écrit
$(arch)/$(syst)/$(comp). Avec les noms de chaque répertoire sans
majuscules, et 8 caractères au max. Or, je ne crois pas que ce
soit essentiel aujourd'hui -- c'est une reste historique. Mais
je n'ai pas encore réelement décidé avec quoi je veux le
remplacer : $(arch)-$(syst)-$(comp), peut-être, à la GNU, avec
arch-$(arch), etc. pour les cas où il n'y a dépendence que sur
un seul des éléments. Ou comme tu dis, simplement plus de
liberté dans le nommage, avec des majuscules. (C'est vrai que
c'est un changement qui ne me coûterait que quelques minutes. Et
qui serait en plus conforme à la convention que j'ai adopté
depuis dans la bibliothèque : un répertoire dont le nom commence
par une minuscule ne contient que du généré.)

--
James Kanze kanze.james (AT) neuf (DOT) fr
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
James Kanze
Guest





PostPosted: Sun Feb 26, 2006 4:59 pm    Post subject: Re: Conditions sur des paramètres templates Reply with quote

Fabien LE LEZ wrote:
Quote:
On Sat, 25 Feb 2006 15:49:11 +0100, James Kanze <kanze.james (AT) neuf (DOT) fr>:

j'ai un macro du nom « linux » (qui m'ennuie pas mal,
parce que j'ai un répertoire avec les en-têtes qui s'appelle
linux, et « #include "gb/syst/linux/xxx.hh" » ne marche pas très
bien quand tu remplaces linux avec 1).

Comment t'en sors-tu dans ce cas ? Tu renommes le répertoire en
"Linux" ?
Back to top
meow
Guest





PostPosted: Sun Feb 26, 2006 5:06 pm    Post subject: Re: Conditions sur des paramètres templates Reply with quote

OK... Merci Kanze, dit comme ça oui, c'est évident. Vu que c'est une
doc de C++, "l'implémentation" se reporte évidemment à C++ lui meme,
et donc au compilo ! Il ne manquait donc rien dans la phrase Smile
A ma décharge, je n'ai pas l'habitude de me placer dans l'optique de
celui qui code un compilo Very Happy
Back to top
Fabien LE LEZ
Guest





PostPosted: Mon Feb 27, 2006 1:06 am    Post subject: Re: Conditions sur des paramètres templates Reply with quote

On Sun, 26 Feb 2006 12:57:42 +0100, James Kanze <kanze.james (AT) neuf (DOT) fr>:

Quote:
Parce que
j'imagine que s'ils définissent linux par défaut, il y a bien
une raison.

Au moins, sous Windows, les compilos respectent la norme : les machins
définis sont _Windows et __WIN32__.

Au fait, si tu utilises le mot "linux" dans tes répertoires, ça veut
dire que tu fais du code compatible avec toutes les versions de Linux,
mais incompatible avec BSD par exemple ?
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  Next
Page 1 of 2

 
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.