 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Etienne Rousee Guest
|
Posted: Sun Oct 29, 2006 10:48 pm Post subject: Template et constante |
|
|
Bonjour,
Le code suivant ne compile pas parce que
k n'est pas une constante:
template <int N> class Entier
{
.........
};
int k = 5;
Entier <k> l;
Y aurait il une autre construction permettant de faire ça ?
Mon contexte est l'implémentation des anneaux Z/nZ,
des polynômes à coeefficients là dedans, et de quelques
calculs de groupes.
--
Etienne |
|
| Back to top |
|
 |
Manuel Zaccaria Guest
|
Posted: Mon Oct 30, 2006 12:09 am Post subject: Re: Template et constante |
|
|
Etienne Rousee a écrit:
Bonjour,
| Quote: |
Le code suivant ne compile pas parce que
k n'est pas une constante:
template <int N> class Entier
{
........
};
int k = 5;
|
int const k = 5;
ou bien:
enum { k = 5 };
Du coup, k est une constante de compilation
et n'est plus modifiable par la suite.
-
Manuel Zaccaria |
|
| Back to top |
|
 |
Sylvain Togni Guest
|
Posted: Mon Oct 30, 2006 12:11 am Post subject: Re: Template et constante |
|
|
Etienne Rousee a écrit :
| Quote: | Le code suivant ne compile pas parce que
k n'est pas une constante:
template <int N> class Entier
{
........
};
int k = 5;
Entier <k> l;
Y aurait il une autre construction permettant de faire ça ?
Mon contexte est l'implémentation des anneaux Z/nZ,
des polynômes à coeefficients là dedans, et de quelques
calculs de groupes.
|
Si k est une constante il faut la déclarer const pour que
cela fonctionne.
Sinon il faut trouver un moyen pour convertir le polymorphisme
statique (les templates) en polymorphisme dynamique (variant
pendant l'exécution). Par exemple :
switch(k)
{
case 1: {Entier<1> l; ...} break;
case 2: {Entier<2> l; ...} break;
case 3: {Entier<3> l; ...} break;
case 4: {Entier<4> l; ...} break;
case 5: {Entier<5> l; ...} break;
}
Mais si on en arrive là, il y a de fortes changes qu'il y ait
un problème de conception quelque part. Les templates ne sont
peut être pas la bonne solution.
--
Sylvain Togni |
|
| Back to top |
|
 |
Etienne Rousee Guest
|
Posted: Mon Oct 30, 2006 4:40 am Post subject: Re: Template et constante |
|
|
"Sylvain Togni" <sylvain.togni (AT) NOSPAMwanadoo (DOT) fr> a écrit...
| Quote: | Si k est une constante il faut la déclarer const pour que
cela fonctionne.
|
Ce n'est pas le cas, k peut être saisi par l'utilisateur.
| Quote: | Sinon il faut trouver un moyen pour convertir le polymorphisme
statique (les templates) en polymorphisme dynamique (variant
pendant l'exécution). Par exemple :
switch(k)
{
case 1: {Entier<1> l; ...} break;
case 2: {Entier<2> l; ...} break;
case 3: {Entier<3> l; ...} break;
case 4: {Entier<4> l; ...} break;
case 5: {Entier<5> l; ...} break;
}
|
Ceci fait bien ce que je voudrais, mais il faudrais alors
que je mette des milliers de lignes dans mon switch.
Et ceci que pour l ....... Et il n'est pas seul ....
| Quote: | Mais si on en arrive là, il y a de fortes changes qu'il y ait
un problème de conception quelque part. Les templates ne sont
peut être pas la bonne solution.
|
Peut-être bien, je vais réfléchir à la question.
--
Etienne |
|
| Back to top |
|
 |
Sylvain Guest
|
Posted: Mon Oct 30, 2006 5:43 am Post subject: Re: Template et constante |
|
|
Etienne Rousee wrote on 29/10/2006 17:48:
| Quote: |
template <int N> class Entier
{
.........
};
int k = 5;
Entier <k> l;
Y aurait il une autre construction permettant de faire ça ?
|
"ça" est assez peu décrit par ce qui précéde!
quelles sont les occurences de 'N' dans le patron défini ? leur nombre,
leur implication par rapport à l'algorithmie de la classe, ... ?
plus avant que représente la classe Entier par rapport à un anneau?
s'il s'agit seulement d'un entier à qui pourra être appliqué mod N pour
déterminer si ce résultat est congru à la "caractéristique" N du
template, cela me parait un petit peu compliqué.
| Quote: | Mon contexte est l'implémentation des anneaux Z/nZ,
des polynômes à coeefficients là dedans, et de quelques
calculs de groupes.
|
si le paramètre template 'N' est le modulus de l'anneau, on pourra
surement définir:
class Entier {
private:
int n;
...
public:
Entier(int mod) : n(mod) { ... }
...
};
tous les calculs internes faisant intervenir n comme une donnée membre
seront codés à l'identique par substitution de N constante en ce n.
Sylvain. |
|
| Back to top |
|
 |
Vincent Lascaux Guest
|
Posted: Mon Oct 30, 2006 6:07 am Post subject: Re: Template et constante |
|
|
| Quote: | switch(k)
{
case 1: {Entier<1> l; ...} break;
case 2: {Entier<2> l; ...} break;
case 3: {Entier<3> l; ...} break;
case 4: {Entier<4> l; ...} break;
case 5: {Entier<5> l; ...} break;
}
Ceci fait bien ce que je voudrais, mais il faudrais alors
que je mette des milliers de lignes dans mon switch.
Et ceci que pour l ....... Et il n'est pas seul ....
|
Juste pour le fun:
template<int N>
struct EntierDynamique
{
static inline bool Execute(int n)
{
if (!EntierDynamique<N - 1>::Execute(N - 1) && n == N)
{
Entier<N> l; ...
return true;
}
else
return false;
}
};
template<>
struct EntierDynamique<0>
{
static inline bool Execute(int n)
{
return false;
}
};
EntierDynamique<100000>::Execute(k);
devrait être remplacé à la compilation par quelque chose qui ressemblerait à
ce code (mais ne l'est probablement pas vu que j'ai pas testé )
if (k == 1)
{
Entier<1> l; ...
} else if (k == 2) {
Entier<2> l; ...
} else if (k == 3) {
Entier<3> l; ...
} else ..... {
} else if (k == 100000) {
Entier<100000> l; ...
}
et vaut true si k était dans 1 .. 100 000
Mais bon, bonjour le temps de compilation, la taille de l'exe
En s'amusant on doit pouvoir obtenir une recherche un peu plus en arbre de
la bonne valeur... Je sais pas trop comment simuler un vrai switch avec les
templates par contre.
--
Vincent |
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Mon Oct 30, 2006 6:44 am Post subject: Re: Template et constante |
|
|
Vincent Lascaux a écrit :
| Quote: | struct EntierDynamique
{
static inline bool Execute(int n)
{
if (!EntierDynamique<N - 1>::Execute(N - 1) && n == N)
{
Entier<N> l; ...
return true;
}
else
return false;
}
};
template
struct EntierDynamique<0
{
static inline bool Execute(int n)
{
return false;
}
};
EntierDynamique<100000>::Execute(k);
devrait être remplacé à la compilation par quelque chose qui ressemblerait à
ce code (mais ne l'est probablement pas vu que j'ai pas testé )
|
Il y a de fortes chances que ce genre de chose dépasse la profondeur
d'instanciation de template du compilateur. J'ai déjà vu du code qui ne
se basais pas sur du <N-1> mais sur du <N/2> (avec gestion des restes,
bien entendu) pour contourner ce genre de problème.
--
Loïc |
|
| Back to top |
|
 |
Etienne Rousee Guest
|
Posted: Mon Oct 30, 2006 10:59 pm Post subject: Re: Template et constante |
|
|
"Sylvain" <noSpam (AT) mail (DOT) net> a écrit ...
| Quote: | Etienne Rousee wrote on 29/10/2006 17:48:
template <int N> class Entier
{
.........
};
int k = 5;
Entier <k> l;
Y aurait il une autre construction permettant de faire ça ?
"ça" est assez peu décrit par ce qui précéde!
quelles sont les occurences de 'N' dans le patron défini ? leur nombre,
leur implication par rapport à l'algorithmie de la classe, ... ?
|
C'est le n de Z/nZ.
| Quote: | plus avant que représente la classe Entier par rapport à un anneau?
|
Un "Entier" est un entier modulo N.
| Quote: | s'il s'agit seulement d'un entier à qui pourra être appliqué mod N pour
déterminer si ce résultat est congru à la "caractéristique" N du
template, cela me parait un petit peu compliqué.
|
J'ai déjà surchargé tous les opérateurs algébriques pour cette
classe et tout marche quand on fait des déclarations avec N
en dur (constant) dans le programme.
| Quote: | Mon contexte est l'implémentation des anneaux Z/nZ,
des polynômes à coeefficients là dedans, et de quelques
calculs de groupes.
si le paramètre template 'N' est le modulus de l'anneau, on pourra
surement définir:
class Entier {
private:
int n;
...
public:
Entier(int mod) : n(mod) { ... }
...
};
|
Ben oui, c'est ce qui m'ennuie, mais bon, tant pis.
--
Etienne |
|
| Back to top |
|
 |
Etienne Rousee Guest
|
Posted: Mon Oct 30, 2006 11:15 pm Post subject: Re: Template et constante |
|
|
"Vincent Lascaux" <nospam (AT) nospam (DOT) invalid> a écrit ...
| Quote: | Juste pour le fun:
template<int N
struct EntierDynamique
{
static inline bool Execute(int n)
{
if (!EntierDynamique<N - 1>::Execute(N - 1) && n == N)
{
Entier<N> l; ...
return true;
}
else
return false;
}
};
template
struct EntierDynamique<0
{
static inline bool Execute(int n)
{
return false;
}
};
EntierDynamique<100000>::Execute(k);
|
C'est amusant.
Sur mon système (W2000pro + VC6.0 + 512Mo),
on atteint les limites internes avec 280, alors 10000 !!...
--
Etienne |
|
| Back to top |
|
 |
Etienne Rousee Guest
|
Posted: Mon Oct 30, 2006 11:17 pm Post subject: Re: Template et constante |
|
|
"Loïc Joly" <loic.actarus.joly (AT) numericable (DOT) fr> a écrit ...
| Quote: | Il y a de fortes chances que ce genre de chose dépasse la profondeur
d'instanciation de template du compilateur.
|
Oui, c'est le cas à partir de N = 281.
| Quote: | J'ai déjà vu du code qui ne se basais pas sur du <N-1
mais sur du <N/2> (avec gestion des restes,
bien entendu) pour contourner ce genre de problème.
|
Oui, mais ça reste inapplicable dans mon cas.
Je crois que je n'ai pas le choix, il faut que j'abandonne
les templates.
--
Etienne |
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Oct 31, 2006 12:52 am Post subject: Re: Template et constante |
|
|
"Etienne Rousee" <etienne (AT) rousee (DOT) org> writes:
| Quote: | "Loïc Joly" <loic.actarus.joly (AT) numericable (DOT) fr> a écrit ...
Il y a de fortes chances que ce genre de chose dépasse la profondeur
d'instanciation de template du compilateur.
Oui, c'est le cas à partir de N = 281.
J'ai déjà vu du code qui ne se basais pas sur du <N-1
mais sur du <N/2> (avec gestion des restes,
bien entendu) pour contourner ce genre de problème.
Oui, mais ça reste inapplicable dans mon cas.
Je crois que je n'ai pas le choix, il faut que j'abandonne
les templates.
|
Qu'est-ce que tu voulais que les templates t'apportent?
A noter que:
template <int& N>
class foo { ... };
int x;
foo<x> bar;
est possible.
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 |
|
 |
Etienne Rousee Guest
|
Posted: Tue Oct 31, 2006 2:22 am Post subject: Re: Template et constante |
|
|
"Jean-Marc Bourguet" <jm (AT) bourguet (DOT) org> a écrit ...
| Quote: | les templates.
Qu'est-ce que tu voulais que les templates t'apportent?
|
Ça me paraissait la méthode adaptée à ce que je voulais,
la plus simple. Ce n'est peut-être pas le cas.
| Quote: | A noter que:
template <int& N
class foo { ... };
int x;
foo<x> bar;
est possible.
|
Pas pour VC++ 6.0 (Je sais, c'est une pièce de musée).
Je vais essayer avec autre chose.
Au fait, que pensez vous (collectif) du nouveau turbo C++ ?
--
Etienne |
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Oct 31, 2006 2:46 am Post subject: Re: Template et constante |
|
|
"Etienne Rousee" <etienne (AT) rousee (DOT) org> writes:
| Quote: | "Jean-Marc Bourguet" <jm (AT) bourguet (DOT) org> a écrit ...
les templates.
Qu'est-ce que tu voulais que les templates t'apportent?
Ça me paraissait la méthode adaptée à ce que je voulais,
la plus simple. Ce n'est peut-être pas le cas.
A noter que:
template <int& N
class foo { ... };
int x;
foo<x> bar;
est possible.
Pas pour VC++ 6.0 (Je sais, c'est une pièce de musée).
|
Je ne sais pas. Je ne l'ai jamais utilisé.
À noter qu'il faut que x soit une variable globale non statique.
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 |
|
 |
Sylvain Guest
|
Posted: Tue Oct 31, 2006 2:58 am Post subject: Re: Template et constante |
|
|
Etienne Rousee wrote on 30/10/2006 18:15:
| Quote: |
Sur mon système (W2000pro + VC6.0 + 512Mo),
on atteint les limites internes avec 280, alors 10000 !!...
|
c'est ici la limite avec une heap de compilation par défaut (en principe
aux alentours de 105Mo).
le paramètre /Zm du compilo sert à définir en % l'allocation max.,
/Zm200 donne 200% de 100Mo soit 210Mo
le paramètre maximal documentée est 2000, avec 1400 (1,4Go) on peut
monter à N=10000 (+1 mn de compil).
Sylvain. |
|
| Back to top |
|
 |
Sylvain Guest
|
Posted: Tue Oct 31, 2006 3:08 am Post subject: Re: Template et constante |
|
|
Etienne Rousee wrote on 30/10/2006 17:59:
| Quote: |
quelles sont les occurences de 'N' dans le patron défini ? leur nombre,
leur implication par rapport à l'algorithmie de la classe, ... ?
C'est le n de Z/nZ.
|
ok, je l'avais compris comme cela.
mais cela ne concerne que Entier, pas un anneau dont lequel il existe
peut-être, donc en reformulant, est-ce que N est vraiment le paramètre n
de "Z/nZ" et donc sera sûrement discret car premier (pour que l'anneau
soit un groupe) ou est-il seulement un paramètre (qlq) utilisé pour les
opérateurs mathématiques de Entier ?
ie
Entier<N> operator+ (Entier<N> const& a, Entier<N> const& b){
return Entier<N>((a + b) % N);
}
question subsidiaire, quelles est la limite de N ?
(32, 64 bits ou précision arbitraire ("BigInteger"))
| Quote: | plus avant que représente la classe Entier par rapport à un anneau?
Un "Entier" est un entier modulo N.
|
reste un doute (ou je ne suis pas sur de bien comprendre)
Entier stocke-t-il la partie congrue à N d'un nombre (0 <= contenu de
Entier < N) ou stocke-t-il une valeur quelconque, le modulo
n'intervenant que dans les opérateurs numériques ?
Sylvain. |
|
| Back to top |
|
 |
|
|
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
|
|