8
votes

Utilisation de Auto et DeclType en C ++ 11

J'essaie d'apprendre les fonctionnalités actuellement acceptées de C ++ 11 et j'ai des problèmes avec Auto et RegensionPE. En tant qu'exercice d'apprentissage, je prolonge la liste des classes STD avec certaines fonctions génériques.

template<class T> FList<T>* map(const function<T (_Ty)>& f)


0 commentaires

3 Réponses :


18
votes

dérivé de std :: list code> ou autre std :: code> Les conteneurs sont découragés.

Écrivez vos opérations en fonction des fonctions libres afin de pouvoir fonctionner sur n'importe quel conteneur standard via Itérateurs. P>

Voulez-vous dire "Définir la carte sans utiliser de fonction de modèle"? P>

Vous devriez pouvoir utiliser le type résultat_type code> Type de membre de STD :: Fonction Code> Pour obtenir le type, il renvoie. P>

Il n'est pas nécessaire que vous spécifiez que la fonction est transmise en tant que std :: fonction code>. Vous pouvez le laisser ouverte comme n'importe quel type et laisser le compilateur rejoindre tout. Vous n'avez besoin que de std :: Fonction code> pour le polymorphisme d'exécution. P>

et en utilisant de nouveau pour créer des objets d'allocation de tas de crue et les renvoyer par le pointeur est SOOOO 1992! :) p>

Votre fonction ITER est essentiellement la même chose que le Basé à la gamme pour la boucle . P>

Mais tout cela de côté ... Voulez-vous dire quelque chose comme ça? P>

std::unique_ptr<MyThing> myThing(make_my_thing_somehow());


12 commentaires

J'essaie d'apprendre à utiliser Auto et RegensionPe ne posant pas de questions sur les meilleures pratiques.


Ouais, mais il y a une charge d'autres choses que vous bénéficierez probablement de savoir aussi. J'étais dans un voyage en train avant alors je me suis dit interrompu avant que je suis arrivé au truc Decltype. Mise à jour maintenant.


IIRC, vous n'avez pas besoin de définir la mise en œuvre, mais ne le déclarez que pour DeclType () de travailler, c'est-à-dire que je pense (je ne peux pas tester avec aucun compilateur C ++ 0x maintenant) que 'Modèle T Fake_Type ( ); ' suffit d'écrire 'Decltype (Fake_type ())'


@Dribeas - Excellent! Fonctionne sur VC ++ 2010 Beta 1. mettra à jour.


En tant que bonus ajouté, n'utilisez pas d'identifiants à partir de la lettre de soulignement + majuscule. Ceux-ci sont réservés à la mise en œuvre. Alors STD :: La liste est autorisée à les utiliser, votre classe dérivée n'est pas. :)


Je pensais que c'était quelque chose en commençant par un soulignement qui était réservé à la mise en œuvre?


Je viens de confirmer le même comportement (qui est également le comportement attendu selon le projet actuel) avec G ++ 4.4.


Merci les gars. Je vais abandonner std :: Liste;) et travailler dans mon propre espace de noms. C ++ 0x cherche à être des trucs passionnants, je souhaite juste que les compilateurs ajoutent les nouvelles fonctionnalités plus rapidement.


Pourrait être dans une longue attente pour certaines choses. Je suppose que ces concepts seront faits en dernier dans la plupart des compilateurs commerciaux, simplement parce qu'ils sont une tonne de nouvelle complexité et, en retour, nous obtenons des messages d'erreur plus clairs. Important, oui, mais en termes de retour sur investissement, il n'est nulle part.


Hah, le truc avec make_instance est intelligent. Je viens de trouver votre réponse à la recherche d'une réponse au même problème. :) Je suis surpris que je n'ai pas prélevé cette réponse quand je l'ai commentée pour la première fois. +1 maintenant.


Je l'ai appris de la source de Boost MPL - il y avait plusieurs versions de celle-ci dispersées à l'époque (environ 2005, je pense).


Préférez aussi ++ i à i ++.



0
votes

Vous ne pouvez pas utiliser Auto dans les arguments de la fonction où vous souhaitez déduire les types d'arguments. Vous utilisez des modèles pour cela. Jettes un coup d'oeil à: http://thenewcpp.wordpress.com/2011/10/18/ le mot-clé-auto / et http://thenewcpp.wordpress.com/2011/10/25/ DeclType-and-déclval / . Ils expliquent tous les deux comment utiliser Auto et RegensionPE. Ils devraient vous donner suffisamment d'informations sur la façon dont ils sont utilisés. En particulier, une autre réponse sur Make_Instance pourrait être mieux faite avec déclnval.


0 commentaires

0
votes

Je pense que le point que Jarrah faisait dans sa réponse est que ces points expliquent exactement comment utiliser ces choses. Je soulignerai les détails de toute façon:

Vous ne pouvez pas faire cela, il y a deux choses qui ne vont pas: xxx

auto ne peut pas être utilisé pour les arguments de la fonction. Si vous voulez que le type de fonction soit déduit, vous devez utiliser des modèles. La seconde est que DeclType prend une expression, alors que _ty est un type. Voici comment le résoudre: xxx

De cette façon, il n'y a pas de magie pour créer une instance d'un type.


0 commentaires