Re: assurer l'héritage d'un template
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>.
|