J'ai une fonction:
MyClass** array = new MyClass[100]; std::vector<MyClass*> subset = get_values_at_indices(array, indices);
J'appelle la fonction avec
auto get_values_at_indices(auto* array, Vector<int>* indices)
{
std::vector<decltype(*array)> ret(indices->size());
for (int i = 0; i < indices->size(); i ++)
{
int index = indices[i];
ret.push_back(array[index]);
}
return ret;
}
Mais le compilateur voit decltype ( * array) comme MyClass * & (par opposition à MyClass * , ce que je veux) - que dois-je essayer?
(PS, j'ai essayé std :: vector mais pas de dés;)
p>
3 Réponses :
* array est une expression lvalue, puis decltype donne T & , c'est-à-dire MyClass * & .
b) si la catégorie de valeur de expression est lvaleur , alors
decltypedonneT &; p >
Vous pouvez exécuter std :: remove_reference code > (ou std :: decay a> selon votre intention) sur le type, par exemple
std::vector<std::remove_reference_t<decltype(*array)>> ret(indices->size());
BTW: decltype (& (** array)) devrait fonctionner, vous ' vous donnez un autre *.
Si vous êtes sûr que votre type ne peut être qu'un type arithmétique ou pointeur, vous pouvez utiliser un operator+ :
std::vector<decltype(+*array)> ret(indices->size());
C'est comme si vous essayiez de faire arithmétique sur la valeur - le résultat ne peut pas être une référence, mais est toujours le type lui-même.
Pas de réponse directe à votre question. Mais je trouve que l'utilisation de auto à cet endroit n'est pas tout à fait expressive et que cela oblige simplement à utiliser la syntaxe maladroite comme remove_reference.
Si vous utilisez simplement le paramètre de modèle normal, vous pouvez exprimer votre intention plus facilement (et est mieux pris en charge par les compilateurs):
template <typename T>
auto get_values_at_indices(const T* array, const Vector<int>* indices)
{
std::vector<T> ret(indices->size());
for (int i = 0; i < indices->size(); i ++)
{
int index = indices[i];
ret.push_back(array[index]);
}
return ret;
}
Changerait également ces Vector Vector et au lieu d'utiliser le array T * array brut, je chercherais en utilisant const span
Merci. Je n'ai jamais rencontré span auparavant - je vais chercher.
MyClass ** array = new MyClass [100];- Cela n'a pas de sens. SoitMyClass * array = new MyClass [100];ouMyClass ** array = new MyClass * [100];. Au mieux, utilisez simplement un vecteur-de-vecteurs .Qu'entendez-vous par "pas de dés"? Ça ne marche pas?
Désolé, nouveau MyClass * [100]. Et oui "pas de dés" signifie n'a pas fonctionné.