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 de template

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Pierre THIERRY
Guest





PostPosted: Wed Jun 14, 2006 9:38 pm    Post subject: Template de template Reply with quote



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 (AT) levallois (DOT) eu.org
OpenPGP 0xD9D50D8A
Back to top
Pierre THIERRY
Guest





PostPosted: Wed Jun 14, 2006 10:04 pm    Post subject: Re: Template de template Reply with quote



Le Wed, 14 Jun 2006 18:38:38 +0200, Pierre THIERRY a écrit :
Quote:
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
--
nowhere.man (AT) levallois (DOT) eu.org
OpenPGP 0xD9D50D8A
Back to top
Marc Duflot
Guest





PostPosted: Thu Jun 15, 2006 9:11 am    Post subject: Re: Template de template Reply with quote



Pierre THIERRY wrote:
Quote:
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);
}
Back to top
Sylvain Togni
Guest





PostPosted: Thu Jun 15, 2006 9:11 am    Post subject: Re: Template de template Reply with quote

Pierre THIERRY a écrit :
Quote:
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
Back to top
Fabien Chêne
Guest





PostPosted: Thu Jun 15, 2006 11:23 pm    Post subject: Re: Template de template Reply with quote

Marc Duflot a écrit :

Quote:
#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
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
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.