2017-04-17 5 views
0

Si j'ai un conteneur 3D, qui peut être la combinaison de tous les types contenant là-bas. et je dois écrire une fonction générique qui reçoit ce conteneur comme un argument, et doit retourner un conteneur 2D (une matrice) qui est du même type que les éléments du conteneur 3D.Comment puis-je connaître le type des éléments de mon conteneur 3D?

Pour expample, le conteneur 3D reçu:

std::vector<std::deque<std::deque<int>>> 3D; 

Le type retourné:

std::deque<std::deque<int>> 

Comment puis-je obtenir cela, et faire le type de retour générique et dépendant du conteneur multidimensionnel qui a été reçu? Disons que j'ai une fonction générique qui reçoit un conteneur 3D, et doit retourner le même type que le conteneur 3D contient. Par exemple: ma fonction est comme ceci:

template<typename 3D> 
auto Function(3D Knt)-> decltype(0+Knt[0]){ 
// randome code 
decltype(0+Knt[0]) K; 
// randome code 
return K; 
} 

Cela va-t-il provoquer des erreurs?

+1

Les conteneurs standard déclarent un membre de type 'value_type' à cette fin. – VTT

+0

Je suis confus: Vous semblez connaître le 'decltype', donc vous devriez être capable de travailler comment obtenir le type. – Rakete1111

+0

Yess, je le sais, mais je ne sais pas comment cibler l'élément, ou l'élément de l'élément du conteneur 3D. Je l'ai essayé comme ceci: auto Fonction (kontainer 3D) -> decltype (0 + 3D [0]) {} mais cela ne semble pas fonctionner – Nane

Répondre

1

Il y a un typedef dans tous les conteneurs STL qui vous donne cette information. Bien sûr, vous pouvez oublier d'imprimer ce type, mais vous pouvez l'utiliser. (vous pouvez play RTTI games to print the name of the type, mais cela dépend du compilateur et cela nécessite un indicateur de mauvaise conception).

Donc, si vous avez:

std::deque<int> myArray; 

vous pouvez utiliser

std::deque<int>::value_type one_element; 

et maintenant one_element sera de type int.

D'autre part, vous pouvez utiliser myArray lui-même pour extraire cette information comme ceci:

decltype(myArray)::value_type one_element; 

et encore, one_element est de type int.

Modifier: Je ne suis pas sûr de comprendre le problème. Mais si vous êtes vous que c'est un conteneur 3D, le type d'élément plus profond peut être extrait comme suit:

Si vous avez:

std::vector<std::vector<std::vector<int> > > 3dArray; 

puis

decltype(3dArray)::value_type::value_type::value_type one_element; 

sera être de type int. Si vous l'utilisez sur un tableau qui n'est pas en 3D, il ne sera pas compilé.

+0

Disons que j'ai une fonction générique qui récupère un conteneur 3D, et qui doit renvoyer le même type que le conteneur 3D. Par exemple: ma fonction est comme ceci: 'modèle ' 'auto Fonction (Knt 3D) -> decltype (0 + Knt [0]) {' '// Randome code' 'decltype (0 + Knt [ 0]) K; '// Code Randome' 'return K;' '}' Est-ce correct? Est-ce que ça va marcher? – Nane

+0

@Nane Deux choses: 1. Ajoutez ceci à votre question, je ne peux pas comprendre ici. 2. Essayez-le avant de demander "ce travail" et posez des questions sur le problème quand il ne fonctionne pas, pas sur le fait de savoir si ça va marcher. –

+0

Je l'ai ajouté. Je suis désolé de vous déranger, c'est essentiellement comment ma fonction ressemble (simplifiée), et je l'ai essayé à l'avance, mais le compilateur signale des erreurs (beaucoup d'entre eux, et un certain point à cette partie), et je veux juste pour savoir si c'est une bonne façon de le faire ou si j'ai fait une erreur parce que je ne l'ai jamais utilisé auparavant et que ma connaissance de son utilisation est un peu fragile. N'essayant pas d'être paresseux, je ne suis qu'un débutant. – Nane