|
|
Up |
  |
Author: jeremie fouchejeremie fouche Date: May 8, 2008 15: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.
un bon exemple vaut mieux qu'un long discourt :
#include
class A
{
public:
A() {}
void Do() { std::cout << "A" << std::endl; }
};
class B : public A
{
public:
B() {}
void Do() { std::cout << "B" << std::endl; }
};
|
| Show full article (0.92Kb) |
| 24 Comments |
|
  |
Author: Sylvain SFSylvain SF Date: May 8, 2008 15:37
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.
|
| |
| no comments |
|
  |
Author: jeremie fouchejeremie fouche Date: May 8, 2008 15:44
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 ?
|
| Show full article (1.02Kb) |
| no comments |
|
  |
Author: Fabien LE LEZFabien LE LEZ Date: May 8, 2008 15:57
On Fri, 09 May 2008 00:21:26 +0200, jeremie fouche :
> 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()
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"
|
| Show full article (1.29Kb) |
| no comments |
|
  |
Author: Fabien LE LEZFabien LE LEZ Date: May 8, 2008 15:59
On Fri, 09 May 2008 00:44:51 +0200, jeremie fouche :
>Je souhaite refuser d'utiliser la méthode D::Do 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.
|
| |
| no comments |
|
  |
Author: Fabien LE LEZFabien LE LEZ Date: May 8, 2008 16:00
On Fri, 09 May 2008 00:57:41 +0200, Fabien LE LEZ :
>Apparemment que le code suivant
Ja parler la France aussi bien que Johnny...
Désolé.
|
| |
| no comments |
|
  |
Author: Sylvain SFSylvain SF Date: May 8, 2008 17:09
Fabien LE LEZ wrote on 09/05/2008 00:57:
>
> template 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.
|
| |
| no comments |
|
  |
Author: Sylvain SFSylvain SF Date: May 8, 2008 17:23
Sylvain SF wrote on 09/05/2008 02:09:
>
> c'est le cas ici ?
j'ai trouvé mes réponses ... et je ne les ai pas comprises!
Sylvain.
|
| |
| no comments |
|
  |
Author: Fabien LE LEZFabien LE LEZ Date: May 8, 2008 17:37
On Fri, 09 May 2008 02:09:53 +0200, "Sylvain SF" :
>je pensais bien à un typeid mais les infos ne sont disponibles
>qu'au runtime pas à la compil., c'est le cas ici ?
Non, non, ici tout est statique.
L'OP voulait un système tel que la ligne "Do ();" compile, et les
lignes "Do();" et "Do();" ne compilent pas. C'est le cas : les
deux derniers déclenchent une erreur de compilation.
"SUPERSUBCLASS_STRICT (A, T)" est une valeur, calculée par le
compilateur, égale à 1 si T dérive (strictement) de A, et à 0 sinon.
"STATIC_CHECK (true, ..." est une no-op.
"STATIC_CHECK (false, ..." est un code incorrect.
En fait, on pourrait l'implémenter comme ceci :
#define STATIC_CHECK(x) { char dummy[x]; }
Si x vaut 0, le code n'est pas correct, et le compilo râle ; si x>0,
ce code ne fait rien d'utile.
C'est très différent de assert(x), qui ne déclenche jamais d'erreur de
compilation (mais peut parfois arrêter le programme à l'exécution.)
>"T_doit_deriver_de_A" correspond à quoi ?
|
| Show full article (1.45Kb) |
| no comments |
|
  |
Author: James KanzeJames Kanze Date: May 9, 2008 01:53
On May 9, 2:09 am, "Sylvain SF" boiteaspam.info> wrote:
> Fabien LE LEZ wrote on 09/05/2008 00:57:
>> template 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 ?)
Je te conseille le Vandevoorde et Josuttis : il décrit en
détail ce genre de chose, et c'est extrèmement bien écrit. Dans
ce cas-ci, grosso modo :
|
| Show full article (5.47Kb) |
| no comments |
|
RELATED THREADS |
  |
|
|
|
|
|
|
|