3 votes

Passer le conteneur value_type comme paramètre du modèle ?

Est-il possible de passer le value_type d'un conteneur comme paramètre de modèle ?

quelque chose comme :

template<typename VertexType>
class Mesh
{
    std::vector<VertexType> vertices;
};

std::vector<VertexPositionColorNormal> vertices;

// this does not work, but can it work somehow?
Mesh<typename vertices::value_type> mesh;

// this works, but defeats the purpose of not needing to know the type when writing the code
Mesh<typename std::vector<VertexPositionColorNormal>::value_type> mesh;

j'obtiens un "invalid template argument" lors de la création du maillage (le premier), mais cela devrait fonctionner, non ? je passe un type connu au moment de la compilation, pourquoi cela ne fonctionne-t-il pas ? quelles sont les alternatives ?

Merci.

8voto

Andy Prowl Points 62121

En C++11, vous pouvez utiliser decltype :

    Mesh<decltype(vertices)::value_type> mesh;
//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Un exemple complet de compilation serait :

#include <vector>

struct VertexPositionColorNormal { };

template<typename VertexType>
class Mesh
{
    std::vector<VertexType> vertices;
};

int main()
{
    std::vector<VertexPositionColorNormal> vertices;

    Mesh<decltype(vertices)::value_type> mesh;
//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}

Exemple concret .

En revanche, si vous êtes limité à C++03, le mieux que vous puissiez faire est probablement de définir un alias de type :

int main()
{
    std::vector<VertexPositionColorNormal> vertices;

    typedef typename std::vector<VertexPositionColorNormal>::value_type v_type;

    // this does not work, but can it work somehow?
    Mesh<v_type> mesh;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X