Templates bornés

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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. ;)

+0 -0

Lu'!

On pourrait avoir le vrai nom et le rôle de la classe ? Histoire de comprendre exactement ce que tu veux faire. Parce que vu que la solution technique doit pas être triviale, peut-être qu'en simplifiant la conception on atteindrait le même but plus facilement.

First : Always RTFM - "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein

+0 -0

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)
};
+0 -0
Auteur du sujet

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.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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