C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

template contraint ?
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Aurélien Barbier-Accary
Guest





PostPosted: Thu Jan 05, 2006 9:58 am    Post subject: template contraint ? Reply with quote



Bonjour et bonne année,

Je souhaite écrire une classe qui hérite d'une classe template qui en pratique
doit être fille d'une classe mère connue. Est-il possible de spécifier cette
contrainte ? et si oui comment bien sûr ? Smile Si vous connaissez un bon lien sur
de la documentation, je suis preneur (je n'ai pas encore réussi à trouver).

class mere;
class fille1; // hérite de mere
class fille2; // hérite de mere mais n'a aucun lien avec fille1

template <class T> // T doit être une fille de mere
class maclasse : public T
{
//...
};

Merci d'avance.
Aurélien.
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Thu Jan 05, 2006 10:17 am    Post subject: Re: template contraint ? Reply with quote



Aurélien Barbier-Accary <NOSPAM_barbier.aurelien (AT) free (DOT) fr.invalid> writes:

Quote:
Bonjour et bonne année,

Je souhaite écrire une classe qui hérite d'une classe template qui en
pratique doit être fille d'une classe mère connue. Est-il possible de
spécifier cette contrainte ? et si oui comment bien sûr ? Smile Si vous
connaissez un bon lien sur de la documentation, je suis preneur (je n'ai
pas encore réussi à trouver).

class mere;
class fille1; // hérite de mere
class fille2; // hérite de mere mais n'a aucun lien avec fille1

template <class T> // T doit être une fille de mere
class maclasse : public T
{
//...
};

Il y a des techniques mais j'ai pas le temps de les decrire. Recherche
"concept checking".

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
Marc Duflot
Guest





PostPosted: Thu Jan 05, 2006 10:27 am    Post subject: Re: template contraint ? Reply with quote



Aurélien Barbier-Accary wrote:
Quote:
Bonjour et bonne année,

Je souhaite écrire une classe qui hérite d'une classe template qui en
pratique doit être fille d'une classe mère connue. Est-il possible de
spécifier cette contrainte ? et si oui comment bien sûr ? Smile Si vous
connaissez un bon lien sur de la documentation, je suis preneur (je n'ai
pas encore réussi à trouver).

class mere;
class fille1; // hérite de mere
class fille2; // hérite de mere mais n'a aucun lien avec fille1

template <class T> // T doit être une fille de mere
class maclasse : public T
{
//...
};

Regarde du côté de Boost.TypeTraits :

BOOST_STATIC-ASSERT(is_base_of<mere, T>::value)

(non-testé).

Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Thu Jan 05, 2006 11:13 am    Post subject: Re: template contraint ? Reply with quote

Jean-Marc Bourguet a écrit :
Quote:
Il y a des techniques mais j'ai pas le temps de les decrire. Recherche
"concept checking".

A+


Je n'ai pas encore trouvé ce que je cherche mais merci pour le tuyau.
Et pour les curieux, je vous conseille de lire
http://home.fnal.gov/~wb/metaprogramming.ppt pour en apprendre plus sur
l'utilisation des templates pour faire de la meta-programmation avec des gains
d'exécution et de maintenance énormes. Bon par contre il faut s'accrocher, côté
temps de développement au début... :-)

Back to top
Marc Boyer
Guest





PostPosted: Thu Jan 05, 2006 12:33 pm    Post subject: Re: template contraint ? Reply with quote

Le 05-01-2006, Aurélien Barbier-Accary a écrit :
Quote:
Bonjour et bonne année,

Je souhaite écrire une classe qui hérite d'une classe template qui en pratique
doit être fille d'une classe mère connue. Est-il possible de spécifier cette
contrainte ? et si oui comment bien sûr ? Smile Si vous connaissez un bon lien sur
de la documentation, je suis preneur (je n'ai pas encore réussi à trouver).

class mere;
class fille1; // hérite de mere
class fille2; // hérite de mere mais n'a aucun lien avec fille1

template <class T> // T doit être une fille de mere
class maclasse : public T
{
//...
};

http://public.research.att.com/~bs/bs_faq2.html#constraints

/// Declaration de la contrainte
template <class T, class B> struct Derived_from {
static void constraints(T* p) { B* pb = p; }
Derived_from() { void(*p)(T*) = constraints; }
};


template <class T> // T doit être une fille de mere
class maclasse : public T {
maclasse(...){
Derived_from<T,mere>();
....
}
....
}

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain

Back to top
kanze
Guest





PostPosted: Fri Jan 06, 2006 8:37 am    Post subject: Re: template contraint ? Reply with quote

Aurélien Barbier-Accary wrote:
Quote:
Jean-Marc Bourguet a écrit :

Il y a des techniques mais j'ai pas le temps de les decrire.
Recherche "concept checking".

Je n'ai pas encore trouvé ce que je cherche mais merci pour le
tuyau. Et pour les curieux, je vous conseille de lire
http://home.fnal.gov/~wb/metaprogramming.ppt pour en apprendre
plus sur l'utilisation des templates pour faire de la
meta-programmation avec des gains d'exécution et de
maintenance énormes. Bon par contre il faut s'accrocher, côté
temps de développement au début... Smile

C'est une bonne introduction, mais méfie-toi en ce qui concerne
les gains de maintenance. Les métaprogrammes eux-même sont
extrèmement difficile à maintenir. Les gains ne se réalisent
donc que si 1) le métaprogramme sert beaucoup (ce qui implique
qu'il est bien documenté et facile à utilisé), et 2) il est
assez stable lui-même, pour qu'on n'a pas souvent besoin d'y
intervenir.

Dans la pratique, je crains que ces conditions ne soient
rarement remplies dans les bureaux d'études d'informatique des
sociétés non spécialisées, où on développe surtout des
applications « in house ». Dans ces cas-là, je n'hésiterais pas
à utiliser des métaprogrammes existants, surtout de Boost, mais
j'aurais des réticences à en développer des propres moi-même.

--
James Kanze GABI Software
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


Back to top
Gilles
Guest





PostPosted: Fri Jan 06, 2006 4:32 pm    Post subject: Re: template contraint ? Reply with quote

| class mere;
Quote:
class fille1; // hérite de mere
class fille2; // hérite de mere mais n'a aucun lien avec fille1

template <class T> // T doit être une fille de mere
class maclasse : public T
{
//...
};

Bonjour,

Il y a quelques semaines je suis tombé sur un code qui pourrait faire
l'affaire (voir ci-dessous).

Gilles.



template <class BaseClass, class Class>
class Inherit
{
private:
class Yes { int a; };
class No { int a[4]; };
static Yes Test(BaseClass*);
static No Test(...);
// NB: il n'est pas utile de definir les fonctions Test ; elles
// ne sont jamais appelees.
public:
// Is vaut 1 ssi Class derive de BaseClass
enum { Is = (sizeof(Test((Class*)0)) == sizeof(Yes) ? 1: 0) };
};

// CheckInt compile ssi I vaut 1
template <int I>
struct CheckInt
{
CheckInt()
{
error !! // provoque une erreur de compilation
}
};
template <> struct CheckInt<1> {};

struct Interface {};

template <class T> struct Truc: CheckInt<Inherit {};

struct Machin: Interface {};

int main()
{
Truc<Machin> t1; // ok
Truc<int> t2; // erreur
}



Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Sun Jan 08, 2006 9:52 am    Post subject: Re: template contraint ? Reply with quote

Marc Boyer a écrit :
Quote:
http://public.research.att.com/~bs/bs_faq2.html#constraints

/// Declaration de la contrainte
template <class T, class B> struct Derived_from {
static void constraints(T* p) { B* pb = p; }
Derived_from() { void(*p)(T*) = constraints; }
};


template <class T> // T doit être une fille de mere
class maclasse : public T {
maclasse(...){
Derived_from<T,mere>();
....
}
....
}

Marc Boyer

Merci pour cette "astuce" !
Malheureusement finalement j'ai du abandonner l'idée car je voulais faire cela
avec des Q_OBJECT (de Qt) ce qui n'est apparemment pas possible (hors quelques
cas particuliers) Sad
En tous cas j'ai gardé bien au chaud la structure Derived_from qui me servira
sans doute très bientôt.
Aurélien.

Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Sun Jan 08, 2006 10:00 am    Post subject: Re: template contraint ? Reply with quote

Marc Duflot a écrit :
Quote:
Regarde du côté de Boost.TypeTraits :

BOOST_STATIC-ASSERT(is_base_of<mere, T>::value)

(non-testé).

Merci.
En fait (je ne suis pas sûr d'avoir raison mais) j'essaye de ne pas utiliser
Boost pour réduire ma dépendance à de trop nombreuses bibliothèques (je dois
déjà utiliser Qt et CGAL).
Il faudra quand même que je me penche un peu plus sur Boost un de ces jours.
Merci encore pour l'info.
Aurélien

Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Sun Jan 08, 2006 10:03 am    Post subject: Re: template contraint ? Reply with quote

kanze a écrit :
Quote:
[...] Dans ces cas-là, je n'hésiterais pas
à utiliser des métaprogrammes existants, surtout de Boost, mais
j'aurais des réticences à en développer des propres moi-même.


Merci pour cette mise en garde.
Je n'ai pas encore commencé à faire de la méta-programmation mais j'y
réfléchirai donc à deux fois.
En tous cas l'idée est très stimulante...
Aurélien.

Back to top
Fabien LE LEZ
Guest





PostPosted: Sun Jan 08, 2006 10:24 am    Post subject: Re: template contraint ? Reply with quote

On Sun, 08 Jan 2006 11:00:59 +0100, Aurélien Barbier-Accary :

Quote:
En fait (je ne suis pas sûr d'avoir raison mais) j'essaye de ne pas utiliser
Boost pour réduire ma dépendance à de trop nombreuses bibliothèques (je dois
déjà utiliser Qt et CGAL).

Il y a un phénomène qui joue contre Boost : à chaque fois qu'on
pourrait l'utiliser, on se dit qu'installer Boost, c'est beaucoup de
travail par rapport au petit problème qu'on a sur le moment, et on
fait soi-même sa petite classe.
Mais sur la longueur, il y a tellement de choses là-dedans que
l'intégrer dans un projet peut être très intéressant.
C'est d'ailleurs ma principale motivation pour abandonner Borland C++
5.02.


Back to top
Marc Boyer
Guest





PostPosted: Mon Jan 09, 2006 8:08 am    Post subject: Re: template contraint ? Reply with quote

Le 08-01-2006, Fabien LE LEZ <gramster (AT) gramster (DOT) com> a écrit :
Quote:
On Sun, 08 Jan 2006 11:00:59 +0100, Aurélien Barbier-Accary :
En fait (je ne suis pas sûr d'avoir raison mais) j'essaye de ne pas utiliser
Boost pour réduire ma dépendance à de trop nombreuses bibliothèques (je dois
déjà utiliser Qt et CGAL).

Il y a un phénomène qui joue contre Boost : à chaque fois qu'on
pourrait l'utiliser, on se dit qu'installer Boost, c'est beaucoup de
travail par rapport au petit problème qu'on a sur le moment, et on
fait soi-même sa petite classe.

En effet. Si en plus on veut fournir le code, cela impose
aux destinataires d'installer eux aussi Boost.

Quote:
Mais sur la longueur, il y a tellement de choses là-dedans que
l'intégrer dans un projet peut être très intéressant.

Merci de ce retour d'expérience, je vais peut-être faire
le saut.

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain

Back to top
Fabien LE LEZ
Guest





PostPosted: Mon Jan 09, 2006 8:20 am    Post subject: Re: template contraint ? Reply with quote

On Mon, 9 Jan 2006 08:08:01 +0000 (UTC), Marc Boyer :

Quote:
Si en plus on veut fournir le code, cela impose
aux destinataires d'installer eux aussi Boost.

Si le destinataire a le même compilo que toi, tu peux fournir la
bibliothèque compilée, ça sera déjà plus simple.
D'autre part, même si tu ne compiles pas la bibliothèque, tu peux
utiliser les parties qui sont entièrement contenues dans des .h.


Back to top
Marc Duflot
Guest





PostPosted: Mon Jan 09, 2006 8:57 am    Post subject: Re: template contraint ? Reply with quote

Aurélien Barbier-Accary wrote:
Quote:
Marc Duflot a écrit :

Regarde du côté de Boost.TypeTraits :

BOOST_STATIC-ASSERT(is_base_of<mere, T>::value)

(non-testé).


Merci.
En fait (je ne suis pas sûr d'avoir raison mais) j'essaye de ne pas
utiliser Boost pour réduire ma dépendance à de trop nombreuses
bibliothèques (je dois déjà utiliser Qt et CGAL).
Il faudra quand même que je me penche un peu plus sur Boost un de ces
jours.

Ça me semble une erreur de ne pas utiliser systématiquement boost.

J'ajoute que, dans le cas présent, les type traits font partie du TR1
donc il se peut que tu n'aies même pas besoin de boost si tu utilises un
compilateur récent.

Marc

Back to top
kanze
Guest





PostPosted: Mon Jan 09, 2006 8:59 am    Post subject: Re: template contraint ? Reply with quote

Aurélien Barbier-Accary wrote:
Quote:
kanze a écrit :
[...] Dans ces cas-là, je n'hésiterais pas
à utiliser des métaprogrammes existants, surtout de Boost, mais
j'aurais des réticences à en développer des propres moi-même.

Merci pour cette mise en garde.
Je n'ai pas encore commencé à faire de la méta-programmation
mais j'y réfléchirai donc à deux fois.

N'oublie pas alors le « dans ces cas-là ». Je parlais d'une
contexte bien précise : j'écris du code qui doit être mainenu
par d'autres personnes. Actuellement, je ne crois pas qu'on
puisse réalistiquement s'attendre à ce qu'un programmeur C++
moyen comprend du code qui utilise la métaprogrammation sans un
effort particulier.

S'il n'y a que toi qui dois maintenir le code, ou un petit
groupe où tout le monde est d'accord pour utiliser la
métaprogrammation, c'est autre choses. Et je dirais même que tu
dois y expérimenter un peu, dans le code que tu écris pour
toi-même, afin de t'y mettre au courant.

Quote:
En tous cas l'idée est très stimulante...

Tout à fait. (Mais n'oublie pas non plus les possibilités de la
génération du code externe.)

--
James Kanze GABI Software
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


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.