Templates bornés

a marqué ce sujet comme résolu.

Bonjour. :)

Je cherche à borner les paramètres d'une classe avec c++11 :

1
2
3
4
5
template<typename T, typename = typename std::enable_if<std::is_base_of<Classe, T>::value, T>::type>
class A
{
   // ...
};

Ici le paramètre de la classe A est borné par la classe 'Classe'. Et maintenant, je voudrais borner le paramètre par la classe elle-même. :D

1
2
3
4
5
template<typename T, typename = typename std::enable_if<std::is_base_of<A<T>, T>::value, T>::type>
class A
{
   // ...
};

Mais là il me dit à la l.1 qu'il ne connait pas A. Donc j'ai essayé d'ajouter une previous declaration, sans spécifier le 2e paramètre du template. Mais du coup, le nombre de paramètre ne correspond pas. Du coup je suis un peu perdu. :euh:

Merci. ;)

oui, explique mieux ce que tu veux faire, car à priori c'est impossible vu qu'il faut connaitre la classe pour la définir. Comme si tu faisais:

1
2
3
4
class A {
public:
    A a; // le compilateur a besoin de la définition complète de A pour définir A. (Ouroboros, tout ça)
};

Alors effectivement ça n'est pas simple. :D Ca n'est pas le problèlme exact mais c'est dans l'idée (présenté en Java) :

On a des classes abstraites paramétrées par les sous-types de ces classes :

1
2
3
4
5
6
7
abstract class AConteneur<E extends AElement<C, E>,
                          C extends AConteneur<E, C>> {
}

abstract class AElement<C extends AConteneur<E, C>,
                        E extends AElement<C, E>> {
}

De cette manière on peut créer les classes :

1
2
class Nombre extends AConteneur<Chiffre, Nombre>
class Chiffre extends AElement<Nombre, Chiffre>

ou encore

1
2
class Mot extends AConteneur<Lettre, Mot>
class Lettre extends AElement<Mot, Lettre>

Ca nous permet donc de définir :

1
2
3
4
5
Nombre n = new Nombre();
n.add(new Chiffre(3));

Mot m = new Mot();
m.add(new Lettre('a'));

Avec la méthode add définit dans les classes abstraites et directement paramétrée.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte