 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Pierre THIERRY Guest
|
Posted: Wed Jun 14, 2006 9:38 pm Post subject: Template de template |
|
|
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
|
Posted: Wed Jun 14, 2006 10:04 pm Post subject: Re: Template de template |
|
|
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
|
Posted: Thu Jun 15, 2006 9:11 am Post subject: Re: Template de template |
|
|
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
|
Posted: Thu Jun 15, 2006 9:11 am Post subject: Re: Template de template |
|
|
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
|
Posted: Thu Jun 15, 2006 11:23 pm Post subject: Re: Template de template |
|
|
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 |
|
 |
|
|
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
|
|