|
|
|
#1 (permalink) |
|
Messages: n/a
Hébergeur: |
Bonsoir
Je ne savais pas trop quel titre donner à mon post. Ce que je souhaite, c'est assurer qu'un membre template hérite d'une classe donnée. un bon exemple vaut mieux qu'un long discourt : #include <iostream> class A { public: A() {} void Do() { std::cout << "A" << std::endl; } }; class B : public A { public: B() {} void Do() { std::cout << "B" << std::endl; } }; class C { public: C() {} void Do() { std::cout << "C" << std::endl; } }; class D { public: D() {} void Test() { Do<B>(); // OK, ca doit compiler Do<A>(); // ne doit pas compiler Do<C>(); // ne doit pas compiler } // template <class T : public A> ne fonctionne pas, dommage template <class T> void Do(void) { T t; t.Do(); } }; int main() { D d; d.Test(); return 0; } C'est possible ? Si oui, comment ? Merci -- Jérémie |
|
|
|
#2 (permalink) |
|
Messages: n/a
Hébergeur: |
jeremie fouche wrote on 09/05/2008 00:21:
> Bonsoir > Je ne savais pas trop quel titre donner à mon post. Ce que je souhaite, > c'est assurer qu'un membre template hérite d'une classe donnée. dans votre exemple, ni la classe D, ni sa fonction membre 'Do' "n'hérite" de la classe B ou A ou C. la garantie serait plus comment s'assurer que la méthode Do reçoit un paramètre donnée. votre question est donc: comment définir une fonction paramétrable qui n'accepte qu'un un seul type de paramètre donné ?! êtes-vous sur que cela a du sens ? ou que votre contrainte est clairement expliquée ? Sylvain. |
|
|
|
#3 (permalink) |
|
Messages: n/a
Hébergeur: |
Sylvain SF a écrit :
> jeremie fouche wrote on 09/05/2008 00:21: >> Bonsoir >> Je ne savais pas trop quel titre donner à mon post. Ce que je souhaite, >> c'est assurer qu'un membre template hérite d'une classe donnée. > > dans votre exemple, ni la classe D, ni sa fonction membre 'Do' > "n'hérite" de la classe B ou A ou C. la garantie serait plus > comment s'assurer que la méthode Do reçoit un paramètre donnée. > votre question est donc: comment définir une fonction paramétrable > qui n'accepte qu'un un seul type de paramètre donné ?! Absolument. > êtes-vous sur que cela a du sens ? ou que votre contrainte est > clairement expliquée ? Je pensais, avec l'exemple donné. Je souhaite refuser d'utiliser la méthode D: o avec autre chose qu'uneclasse héritant de A. C'est plus pour apprendre, car aujourd'hui, en laissant le code tel quel, cela fonctionne correctement dans mon produit. Je voudrais juste savoir si c'est possible ou non. Merci pour le recadrage sur la question -- Jérémie |
|
|
|
#4 (permalink) |
|
Messages: n/a
Hébergeur: |
On Fri, 09 May 2008 00:21:26 +0200, jeremie fouche <jfouche@voila.fr>:
> void Do(void) Note en passant : le deuxième "void" est totalement inutile, et typique d'un code en C. En C++ on écrira plutôt : void Do() >class B : public A > Do<B>(); // OK, ca doit compiler > Do<A>(); // ne doit pas compiler > Do<C>(); // ne doit pas compiler En résumé : - si T = A, erreur de compilation - sinon, si T dérive de A, OK - sinon, erreur C'est bien ça ? Ça ressemble fort aux sections 2.7 et 2.1 de "Modern C++ Design" (Alexandrescu). Apparemment que le code suivant répond à la question : #include "static_check.h" #include "TypeManip.h" class D { public: void Test() { Do<B>(); // OK, ca doit compiler //Do<A>(); // ne doit pas compiler //Do<C>(); // ne doit pas compiler } public: template <class T> void Do() { STATIC_CHECK (SUPERSUBCLASS_STRICT (A, T), T_doit_deriver_de_A); ... } }; Les deux .h se trouvent dans Loki. La version d'origine (basée sur le livre, et sur laquelle se base le code ci-dessus) se trouve à l'adresse <http://www.awprofessional.com/content/images/0201704315/sourcecode/loki.zip>. Pour le reste, cf <http://en.wikipedia.org/wiki/Loki_%28C%2B%2B%29>. |
|
|
|
#5 (permalink) |
|
Messages: n/a
Hébergeur: |
On Fri, 09 May 2008 00:44:51 +0200, jeremie fouche <jfouche@voila.fr>:
>Je souhaite refuser d'utiliser la méthode D: o avec autre chose qu'une>classe héritant de A. Là où j'ai du mal à comprendre le sens, c'est que tu acceptes B mais refuses A. |
|
|
|
#7 (permalink) |
|
Messages: n/a
Hébergeur: |
Fabien LE LEZ wrote on 09/05/2008 00:57:
> > template <class T> void Do() > { > STATIC_CHECK (SUPERSUBCLASS_STRICT (A, T), T_doit_deriver_de_A); > ... > } je pensais bien à un typeid mais les infos ne sont disponibles qu'au runtime pas à la compil., c'est le cas ici ? (j'ai parcouru le wiki mais pas éplucher tout le zip). "T_doit_deriver_de_A" correspond à quoi ? (juste un bool utilisé par STATIC_CHECK pour comparer ses 2 membres ?) Sylvain. |
|
![]() |
| Outils de la discussion | |
|
|