OVH Cloud OVH Cloud

Template de template

4 réponses
Avatar
Pierre THIERRY
Je n'arrive pas à exprimer une idée avec des templates : j'aimerais
qu'un template soit paramétré par un type conteneur et un type contenu.
Voici le genre de code que j'aurais voulu écrire :

template<typename Container_T, typename Content_T>
Container_T<Content_T> pair(Content_T left, Content_T right)
{
Container_T<Content_T> result;
result.push_front(right);
result.push_front(left);
return result;
}

ainsi, j'aurais pu écrire :

int i = 2, j = 3;
pair<list> entiers = pair<list>(i ,j);

Mais la compilation échoue :

list_of.cpp:2: error: 'Container_T' is not a template
list_of.cpp: In function 'Container_T pair(Content_T, Content_T)':
list_of.cpp:4: error: 'Container_T' is not a template

Et je ne sais pas comment indiquer que le type Container_T est lui-même
un template à un argument...

Curieusement,
Nowhere man
--
nowhere.man@levallois.eu.org
OpenPGP 0xD9D50D8A

4 réponses

Avatar
Pierre THIERRY
Le Wed, 14 Jun 2006 18:38:38 +0200, Pierre THIERRY a écrit :
ainsi, j'aurais pu écrire :

int i = 2, j = 3;
pair<list> entiers = pair<list>(i ,j);


Pardon, ça devrait être :

list<int> entiers = pair<list>(i ,j);

L'intérêt étant que je peux changer de type avec un typedef plus haut :

typedef list container;

container<int> entiers = pair<container>(i ,j);

Correctivement,
Nowhere man
--

OpenPGP 0xD9D50D8A

Avatar
Marc Duflot
Pierre THIERRY wrote:
Je n'arrive pas à exprimer une idée avec des templates : j'aimerais
qu'un template soit paramétré par un type conteneur et un type contenu.
Voici le genre de code que j'aurais voulu écrire :

template<typename Container_T, typename Content_T>
Container_T<Content_T> pair(Content_T left, Content_T right)
{
Container_T<Content_T> result;
result.push_front(right);
result.push_front(left);
return result;
}

ainsi, j'aurais pu écrire :

int i = 2, j = 3;
pair<list> entiers = pair<list>(i ,j);

Mais la compilation échoue :

list_of.cpp:2: error: 'Container_T' is not a template
list_of.cpp: In function 'Container_T pair(Content_T, Content_T)':
list_of.cpp:4: error: 'Container_T' is not a template

Et je ne sais pas comment indiquer que le type Container_T est lui-même
un template à un argument...



#include <list>

template<class Content_T, template <class Content_T> class Container_T>
Container_T<Content_T> pair(Content_T left, Content_T right)
{
Container_T<Content_T> result;
result.push_front(right);
result.push_front(left);
return result;
}

int main() {
int i = 2, j = 3;
std::list<int> entiers = pair<int, std::list>(i ,j);
}

Avatar
Sylvain Togni
Je n'arrive pas à exprimer une idée avec des templates : j'aimerais
qu'un template soit paramétré par un type conteneur et un type contenu.
Voici le genre de code que j'aurais voulu écrire :

template<typename Container_T, typename Content_T>
Container_T<Content_T> pair(Content_T left, Content_T right)
{
Container_T<Content_T> result;
result.push_front(right);
result.push_front(left);
return result;
}

ainsi, j'aurais pu écrire :

int i = 2, j = 3;
pair<list> entiers = pair<list>(i ,j);


Une autre solution serait de considérer que l'objet Container contient
un membre value_type (ce qui est le cas des containers standards) :

#include <list>

template<class Container>
Container
pair(typename Container::value_type const& left,
typename Container::value_type const& right)
{
Container result;
result.push_front(right);
result.push_front(left);
return result;
}

int
main()
{
std::list<int> entiers = pair< std::list<int> >(2, 3);
}

--
Sylvain Togni

Avatar
Fabien Chêne

#include <list>

template<class Content_T, template <class Content_T> class Container_T>
Container_T<Content_T> pair(Content_T left, Content_T right)
{
Container_T<Content_T> result;
result.push_front(right);
result.push_front(left);
return result;
}

int main() {
int i = 2, j = 3;
std::list<int> entiers = pair<int, std::list>(i ,j);
}


Je ne suis pas sur que ce code soit valide. std::list est une classe
template avec deux paramètres template, dont un paramètre template
par défaut -- c'est néanmoins bel et bien une classe template à deux
arguments template.

Or, on ne peut pas faire passer une std::list pour une classe template
à un argument template comme c'est le cas pour pair.

g++ l'accepte, mais plus pour longtemps. 4.2 devrait l'évincer si j'en
crois http://gcc.gnu.org/gcc-4.2/changes.html