Template, template, encore des template
Salut à tous,
Je me suis plongé dans la lecture du (très bon) bouquin d'Alexandrescu, et j'essaie d'implémenter une classe template dont l'un des paramètres est une politique.
Bon, je suis arrivé à un truc comme ça :
Code:
1 2 3 4 5 6
| template < class ObjectNeighborhoodPolicy,
class NodesContainer = boost::vecS,
class EdgesContainer = boost::vecS,
class Node = MPPRectangleGraphNode,
class Edges = Weight
> class MPPRectangleGraph : public BGL_Graph<NodesContainer,EdgesContainer,boost::undirectedS,Node,Edges>, public ObjectNeighborhoodPolicy |
Après, ce ne sont encore que des tests. J'ai donc ça :
Code:
1 2 3 4
| template <class T> class truc
{
T machin;
}; |
et à l'instanciation, ça :
Code:
MPPRectangleGraph< truc<MPPRectangleGraphNode> > g;
Alexandrescu donne une méthode pour éviter la déclaration du paramètre template de la politique à l'instanciation (pas que pour ça ...). C'est à dire qu'on a ça :
Code:
1 2 3 4 5 6
| template < template <class AreNeigh> class ObjectNeighborhoodPolicy,
class NodesContainer = boost::vecS,
class EdgesContainer = boost::vecS,
class Node = MPPRectangleGraphNode,
class Edges = Weight
> class MPPRectangleGraph : public BGL_Graph<NodesContainer,EdgesContainer,boost::undirectedS,Node,Edges>, public ObjectNeighborhoodPolicy<LeTemplate> |
Et qu'on l'instancie plus simplement :
Code:
MPPRectangleGraph< truc > g;
Or, dans mon cas, "LeTemplate", c'est mon paramètre qui est déjà template, à savoir "Node".
Pour le code des méthodes, je faisai ça :
Code:
1 2 3 4 5
| template < class ObjectNeighborhoodPolicy ,class NodesContainer,
class EdgesContainer,
class Node,
class Edges> void MPPRectangleGraph<ObjectNeighborhoodPolicy,NodesContainer,EdgesContainer,Node,Edges>::InitDisplayXML( const std::string &XMLfilename )
{//...} |
Si j'utilise le "truc" d'Alexandrescu, comment je dois faire ? Visual(2003) hurle ...
Si je fais ça :
Code:
1 2 3 4 5 6
| template < template <class AN> class ObjectNeighborhoodPolicy,
class NodesContainer = boost::vecS,
class EdgesContainer = boost::vecS,
class Node = MPPRectangleGraphNode,
class Edges = Weight
> class MPPRectangleGraph : public BGL_Graph<NodesContainer,EdgesContainer,boost::undirectedS,Node,Edges>, public ObjectNeighborhoodPolicy<NodesContainer> |
Comment je déclare mes méthodes ?