la classe MyClass<int> ne compilera plus?
la classe MyClass<FooBar> ne compilera que si la classe FooBar possede
une m=E9thode "Process()".
l'id=E9al serait de pouvoir isol=E9e dans une classe de plus haut niveau
toutes les fonction de T_Type qu'utilise MyClass (dans mon exemple il
n'y aurait que Process):
class MyBaseClass
{
void Process();
};
il faudrait maintenant pouvoir d=E9clarer MyClass pour qu'elle ne
fonctionne qu'avec des parametre template d=E9rivant de MyBaseClass...
quelque chose comme:
template <class T_Type : MyBaseClass> /* ceci ne marche pas mais je
crois que =E7a illustre bien ce que je voudrais pouvoir faire */
class MyClass
{
la classe MyClass<int> ne compilera plus? la classe MyClass<FooBar> ne compilera que si la classe FooBar possede une méthode "Process()".
l'idéal serait de pouvoir isolée dans une classe de plus haut niveau toutes les fonction de T_Type qu'utilise MyClass (dans mon exemple il n'y aurait que Process):
class MyBaseClass { void Process();
};
il faudrait maintenant pouvoir déclarer MyClass pour qu'elle ne fonctionne qu'avec des parametre template dérivant de MyBaseClass... quelque chose comme:
template <class T_Type : MyBaseClass> /* ceci ne marche pas mais je crois que ça illustre bien ce que je voudrais pouvoir faire */ class MyClass {
la classe MyClass<int> ne compilera plus?
la classe MyClass<FooBar> ne compilera que si la classe FooBar possede
une méthode "Process()".
l'idéal serait de pouvoir isolée dans une classe de plus haut niveau
toutes les fonction de T_Type qu'utilise MyClass (dans mon exemple il
n'y aurait que Process):
class MyBaseClass
{
void Process();
};
il faudrait maintenant pouvoir déclarer MyClass pour qu'elle ne
fonctionne qu'avec des parametre template dérivant de MyBaseClass...
quelque chose comme:
template <class T_Type : MyBaseClass> /* ceci ne marche pas mais je
crois que ça illustre bien ce que je voudrais pouvoir faire */
class MyClass
{
la classe MyClass<int> ne compilera plus? la classe MyClass<FooBar> ne compilera que si la classe FooBar possede une méthode "Process()".
l'idéal serait de pouvoir isolée dans une classe de plus haut niveau toutes les fonction de T_Type qu'utilise MyClass (dans mon exemple il n'y aurait que Process):
class MyBaseClass { void Process();
};
il faudrait maintenant pouvoir déclarer MyClass pour qu'elle ne fonctionne qu'avec des parametre template dérivant de MyBaseClass... quelque chose comme:
template <class T_Type : MyBaseClass> /* ceci ne marche pas mais je crois que ça illustre bien ce que je voudrais pouvoir faire */ class MyClass {
STATIC_CHECK et SUPERSUBCLASS sont définis pages 23 et 34 (respectivement) de "Modern C++ Design" (Alexandrescu) : http://books.google.com/books?id=aJ1av7UFBPwC&printsec=frontcover&source=gbs_navlinks_s
Ou bien, tu peux directement télécharger le code : http://loki-lib.sourceforge.net/index.php?n=Main.Download
On Wed, 17 Jun 2009 09:21:59 -0700 (PDT), Philippe MESMEUR
<philippe.mesmeur@gmail.com>:
il faudrait maintenant pouvoir déclarer MyClass pour qu'elle ne
fonctionne qu'avec des parametre template dérivant de MyBaseClass...
M'est avis que Loki contient quelque chose comme ça.
STATIC_CHECK et SUPERSUBCLASS sont définis pages 23 et 34
(respectivement) de "Modern C++ Design" (Alexandrescu) :
http://books.google.com/books?id=aJ1av7UFBPwC&printsec=frontcover&source=gbs_navlinks_s
Ou bien, tu peux directement télécharger le code :
http://loki-lib.sourceforge.net/index.php?n=Main.Download
STATIC_CHECK et SUPERSUBCLASS sont définis pages 23 et 34 (respectivement) de "Modern C++ Design" (Alexandrescu) : http://books.google.com/books?id=aJ1av7UFBPwC&printsec=frontcover&source=gbs_navlinks_s
Ou bien, tu peux directement télécharger le code : http://loki-lib.sourceforge.net/index.php?n=Main.Download
Falk Tannhäuser
Fabien LE LEZ schrieb:
On Wed, 17 Jun 2009 09:21:59 -0700 (PDT), Philippe MESMEUR :
il faudrait maintenant pouvoir déclarer MyClass pour qu'elle ne fonctionne qu'avec des paramètre template dérivant de MyBaseClass...
M'est avis que Loki contient quelque chose comme ça.
Voir aussi <http://www.boost.org/doc/libs/1_39_0/libs/type_traits/doc/html/boost_typetraits/reference/is_base_of.html> et <http://www.boost.org/doc/libs/1_39_0/doc/html/boost_staticassert.html>.
Falk
Fabien LE LEZ schrieb:
On Wed, 17 Jun 2009 09:21:59 -0700 (PDT), Philippe MESMEUR
<philippe.mesmeur@gmail.com>:
il faudrait maintenant pouvoir déclarer MyClass pour qu'elle ne
fonctionne qu'avec des paramètre template dérivant de MyBaseClass...
M'est avis que Loki contient quelque chose comme ça.
Voir aussi <http://www.boost.org/doc/libs/1_39_0/libs/type_traits/doc/html/boost_typetraits/reference/is_base_of.html> et
<http://www.boost.org/doc/libs/1_39_0/doc/html/boost_staticassert.html>.
Voir aussi <http://www.boost.org/doc/libs/1_39_0/libs/type_traits/doc/html/boost_typetraits/reference/is_base_of.html> et <http://www.boost.org/doc/libs/1_39_0/doc/html/boost_staticassert.html>.
Falk
Yann Renard
Fabien LE LEZ wrote:
On Wed, 17 Jun 2009 09:21:59 -0700 (PDT), Philippe MESMEUR :
il faudrait maintenant pouvoir déclarer MyClass pour qu'elle ne fonctionne qu'avec des parametre template dérivant de MyBaseClass...
M'est avis que Loki contient quelque chose comme ça.
STATIC_CHECK et SUPERSUBCLASS sont définis pages 23 et 34 (respectivement) de "Modern C++ Design" (Alexandrescu) : http://books.google.com/books?id=aJ1av7UFBPwC&printsec=frontcover&source=gbs_navlinks_s
Ou bien, tu peux directement télécharger le code : http://loki-lib.sourceforge.net/index.php?n=Main.Download
Et pourquoi pas quelque chose comme ça ?
template <class T_Type> class MyClass { MyBaseClass* m_pBase; ...
et quelque part :
m_pBase=&un_T_Type;
Fabien LE LEZ wrote:
On Wed, 17 Jun 2009 09:21:59 -0700 (PDT), Philippe MESMEUR
<philippe.mesmeur@gmail.com>:
il faudrait maintenant pouvoir déclarer MyClass pour qu'elle ne
fonctionne qu'avec des parametre template dérivant de MyBaseClass...
M'est avis que Loki contient quelque chose comme ça.
STATIC_CHECK et SUPERSUBCLASS sont définis pages 23 et 34
(respectivement) de "Modern C++ Design" (Alexandrescu) :
http://books.google.com/books?id=aJ1av7UFBPwC&printsec=frontcover&source=gbs_navlinks_s
Ou bien, tu peux directement télécharger le code :
http://loki-lib.sourceforge.net/index.php?n=Main.Download
Et pourquoi pas quelque chose comme ça ?
template <class T_Type>
class MyClass
{
MyBaseClass* m_pBase;
...
STATIC_CHECK et SUPERSUBCLASS sont définis pages 23 et 34 (respectivement) de "Modern C++ Design" (Alexandrescu) : http://books.google.com/books?id=aJ1av7UFBPwC&printsec=frontcover&source=gbs_navlinks_s
Ou bien, tu peux directement télécharger le code : http://loki-lib.sourceforge.net/index.php?n=Main.Download
Et pourquoi pas quelque chose comme ça ?
template <class T_Type> class MyClass { MyBaseClass* m_pBase; ...
et quelque part :
m_pBase=&un_T_Type;
Michael Doubez
On 18 juin, 10:03, Yann Renard wrote:
Fabien LE LEZ wrote: > On Wed, 17 Jun 2009 09:21:59 -0700 (PDT), Philippe MESMEUR > :
>> il faudrait maintenant pouvoir déclarer MyClass pour qu'elle ne >> fonctionne qu'avec des parametre template dérivant de MyBaseClass...
> M'est avis que Loki contient quelque chose comme ça.
> STATIC_CHECK et SUPERSUBCLASS sont définis pages 23 et 34 > (respectivement) de "Modern C++ Design" (Alexandrescu) : >http://books.google.com/books?id=aJ1av7UFBPwC&printsec=frontcover&so u...
> Ou bien, tu peux directement télécharger le code : >http://loki-lib.sourceforge.net/index.php?n=Main.Download
Et pourquoi pas quelque chose comme ça ?
template <class T_Type> class MyClass { MyBaseClass* m_pBase; ...
et quelque part :
m_pBase=&un_T_Type;
Parcece que c'est plus ou moins ce que font Loki et Boost (ils essayent de matcher un paramètre de fonction) mais que le message d'erreur est bien moins parlant.
-- Michael
On 18 juin, 10:03, Yann Renard <yann.ren...@irisa.nospam.fr> wrote:
Fabien LE LEZ wrote:
> On Wed, 17 Jun 2009 09:21:59 -0700 (PDT), Philippe MESMEUR
> <philippe.mesm...@gmail.com>:
>> il faudrait maintenant pouvoir déclarer MyClass pour qu'elle ne
>> fonctionne qu'avec des parametre template dérivant de MyBaseClass...
> M'est avis que Loki contient quelque chose comme ça.
> STATIC_CHECK et SUPERSUBCLASS sont définis pages 23 et 34
> (respectivement) de "Modern C++ Design" (Alexandrescu) :
>http://books.google.com/books?id=aJ1av7UFBPwC&printsec=frontcover&so u...
> Ou bien, tu peux directement télécharger le code :
>http://loki-lib.sourceforge.net/index.php?n=Main.Download
Et pourquoi pas quelque chose comme ça ?
template <class T_Type>
class MyClass
{
MyBaseClass* m_pBase;
...
et quelque part :
m_pBase=&un_T_Type;
Parcece que c'est plus ou moins ce que font Loki et Boost (ils
essayent de matcher un paramètre de fonction) mais que le message
d'erreur est bien moins parlant.
> STATIC_CHECK et SUPERSUBCLASS sont définis pages 23 et 34 > (respectivement) de "Modern C++ Design" (Alexandrescu) : >http://books.google.com/books?id=aJ1av7UFBPwC&printsec=frontcover&so u...
> Ou bien, tu peux directement télécharger le code : >http://loki-lib.sourceforge.net/index.php?n=Main.Download
Et pourquoi pas quelque chose comme ça ?
template <class T_Type> class MyClass { MyBaseClass* m_pBase; ...
et quelque part :
m_pBase=&un_T_Type;
Parcece que c'est plus ou moins ce que font Loki et Boost (ils essayent de matcher un paramètre de fonction) mais que le message d'erreur est bien moins parlant.
-- Michael
James Kanze
On Jun 18, 3:56 pm, Michael Doubez wrote:
On 18 juin, 10:03, Yann Renard wrote: > Fabien LE LEZ wrote: > > On Wed, 17 Jun 2009 09:21:59 -0700 (PDT), Philippe MESMEUR > > :
> >> il faudrait maintenant pouvoir déclarer MyClass pour > >> qu'elle ne fonctionne qu'avec des parametre template > >> dérivant de MyBaseClass...
> > M'est avis que Loki contient quelque chose comme ça.
> > STATIC_CHECK et SUPERSUBCLASS sont définis pages 23 et 34 > > (respectivement) de "Modern C++ Design" (Alexandrescu) : > >http://books.google.com/books?id=aJ1av7UFBPwC&printsec=frontcover& sou...
> > Ou bien, tu peux directement télécharger le code : > >http://loki-lib.sourceforge.net/index.php?n=Main.Download
Parce ce que c'est plus ou moins ce que font Loki et Boost (ils essayent de matcher un paramètre de fonction) mais que le message d'erreur est bien moins parlant.
En revanche, c'est bien moins lourd que Loki ou Boost, et avec un bon choix de nom de variable (genre ensure_that_T_derives_from_MyBaseClass), le message peut être clair, même s'il n'est pas forcement dans un anglais correct.
Le vrai problème (qu'on peut espérer résoulu dans Boost), c'est d'assurer que le test se fait dans tous les cas où le template est instantié. Mettre l'affectation dans une fonction quelconque, ça n'apporte rien si la fonction n'est pas instantiée. Et éventuellement aussi, de faire en sort que le test n'ajoute rien à la taille de la classe, ni au code réelement généré.
J'avoue aussi que j'utiliserais plutôt la résolution du surcharge pour discriminer. Quelque chose du genre :
D'une bibliothèque plus générale : typedef char TrueType ; struct FalseType { char a[2] ; } ;
template< typename T > class MyClass { static TrueType discriminator( MyBaseClass* ) ; static FalseType discriminator( ... ) ;
, en prenant l'adresse de testForDerivation dans tous les constructeurs. (Prendre l'adresse d'une fonction provoque sont instantiation.) Mais évidemment, c'est déjà nettement plus lourd que ce qui a été proposé, et puisque c'est déjà implémenté en Boost...
-- James Kanze (GABI Software) email: 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
On Jun 18, 3:56 pm, Michael Doubez <michael.dou...@free.fr> wrote:
On 18 juin, 10:03, Yann Renard <yann.ren...@irisa.nospam.fr> wrote:
> Fabien LE LEZ wrote:
> > On Wed, 17 Jun 2009 09:21:59 -0700 (PDT), Philippe MESMEUR
> > <philippe.mesm...@gmail.com>:
> >> il faudrait maintenant pouvoir déclarer MyClass pour
> >> qu'elle ne fonctionne qu'avec des parametre template
> >> dérivant de MyBaseClass...
> > M'est avis que Loki contient quelque chose comme ça.
> > STATIC_CHECK et SUPERSUBCLASS sont définis pages 23 et 34
> > (respectivement) de "Modern C++ Design" (Alexandrescu) :
> >http://books.google.com/books?id=aJ1av7UFBPwC&printsec=frontcover& sou...
> > Ou bien, tu peux directement télécharger le code :
> >http://loki-lib.sourceforge.net/index.php?n=Main.Download
Parce ce que c'est plus ou moins ce que font Loki et Boost
(ils essayent de matcher un paramètre de fonction) mais que le
message d'erreur est bien moins parlant.
En revanche, c'est bien moins lourd que Loki ou Boost, et avec
un bon choix de nom de variable (genre
ensure_that_T_derives_from_MyBaseClass), le message peut être
clair, même s'il n'est pas forcement dans un anglais correct.
Le vrai problème (qu'on peut espérer résoulu dans Boost), c'est
d'assurer que le test se fait dans tous les cas où le template
est instantié. Mettre l'affectation dans une fonction
quelconque, ça n'apporte rien si la fonction n'est pas
instantiée. Et éventuellement aussi, de faire en sort que le
test n'ajoute rien à la taille de la classe, ni au code
réelement généré.
J'avoue aussi que j'utiliserais plutôt la résolution du
surcharge pour discriminer. Quelque chose du genre :
D'une bibliothèque plus générale :
typedef char TrueType ;
struct FalseType { char a[2] ; } ;
template< typename T >
class MyClass
{
static TrueType discriminator( MyBaseClass* ) ;
static FalseType discriminator( ... ) ;
, en prenant l'adresse de testForDerivation dans tous les
constructeurs. (Prendre l'adresse d'une fonction provoque sont
instantiation.) Mais évidemment, c'est déjà nettement plus lourd
que ce qui a été proposé, et puisque c'est déjà implémenté en
Boost...
--
James Kanze (GABI Software) email:james.kanze@gmail.com
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
> > STATIC_CHECK et SUPERSUBCLASS sont définis pages 23 et 34 > > (respectivement) de "Modern C++ Design" (Alexandrescu) : > >http://books.google.com/books?id=aJ1av7UFBPwC&printsec=frontcover& sou...
> > Ou bien, tu peux directement télécharger le code : > >http://loki-lib.sourceforge.net/index.php?n=Main.Download
Parce ce que c'est plus ou moins ce que font Loki et Boost (ils essayent de matcher un paramètre de fonction) mais que le message d'erreur est bien moins parlant.
En revanche, c'est bien moins lourd que Loki ou Boost, et avec un bon choix de nom de variable (genre ensure_that_T_derives_from_MyBaseClass), le message peut être clair, même s'il n'est pas forcement dans un anglais correct.
Le vrai problème (qu'on peut espérer résoulu dans Boost), c'est d'assurer que le test se fait dans tous les cas où le template est instantié. Mettre l'affectation dans une fonction quelconque, ça n'apporte rien si la fonction n'est pas instantiée. Et éventuellement aussi, de faire en sort que le test n'ajoute rien à la taille de la classe, ni au code réelement généré.
J'avoue aussi que j'utiliserais plutôt la résolution du surcharge pour discriminer. Quelque chose du genre :
D'une bibliothèque plus générale : typedef char TrueType ; struct FalseType { char a[2] ; } ;
template< typename T > class MyClass { static TrueType discriminator( MyBaseClass* ) ; static FalseType discriminator( ... ) ;
, en prenant l'adresse de testForDerivation dans tous les constructeurs. (Prendre l'adresse d'une fonction provoque sont instantiation.) Mais évidemment, c'est déjà nettement plus lourd que ce qui a été proposé, et puisque c'est déjà implémenté en Boost...
-- James Kanze (GABI Software) email: 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