C ++ a une sorte de typage de canard pour les types donnés par des paramètres de modèle. Nous n'avons aucune idée de quel type mais c'est un peu gênant d'écrire. Quand je ne me soucie absolument pas quels types réels (Je sais que l'héritage virtuel est la méthode de choix dans la plupart des cas Pour mettre en œuvre de tels modèles, mais la question ici est spécifiquement sur le cas du polymorphisme statique.) p> p> duck1 code> et
duck2 code> sera, mais aussi longtemps qu'ils peuvent
track () code>, il compilera et exécutera: < Pré> xxx pré>
duck1 code> et
Duck2 code> ne veulent pas utiliser pleinement l'idée de dactylographie de canard, alors je voudrais avoir quelque chose de sligthly différent de celui-ci : p>
5 Réponses :
J'aimerais omettre écrire une liste de paramètres de modèle qui est répétitif et surtout dénué de sens (imaginez simplement ce qui se passerait s'il y a 7 canards ...) p>
Pour cela, vous pouvez utiliser des modèles variadiques et faire quelque chose comme ce qui suit: p>
xxx pré> Démo en direct strong> p> blockquote>
Pourquoi dites-vous d.quack () code> deux fois?
@Kerreksb Désolé, pouvez-vous en faire un peu plus clair? Voulez-vous dire la marche triviale de la récursion?
En ce qui concerne les questions 1 et 2: Depuis C ++ 14, vous pouvez omettre explicite template
auto code>, mais uniquement dans lambdas:
template<typename T>
concept bool Quackable = requires(T a) {
a.quack();
};
void let_them_quack (Quackable & donald, Quackable & daisy);
AFAIK Votre exemple Top fonctionne uniquement pour les fonctions gratuites de Lambdas.
@Nathanoliver Je pensais aussi, mais les deux Ideone avec C ++ 14 et mon GCC local l'ont accepté. Semble être une extension, je vais réparer la réponse.
Oui c'est une extension GCC.
Je pense que c'est la seule réponse jusqu'à présent qui frappe l'intention de la question. Dommage que ces idées ne soient pas encore standard ...
Toujours toujours compiler votre code GCC avec -pedantic code> :)
# 2 et n ° 3 sont en quelque sorte pris en charge par le fait que le code ne compilera pas et jette une erreur de compilation, si les classes données ne mettent pas en œuvre l'interface. Vous pouvez également faire cette formelle:
void let_them_quack() { } template <typename ...Args> void let_them_quack(duck* first_duck, Args && ...args) { first_duck->quack(); let_them_quack(std::forward<Args>(args)...); }
Je suis d'accord avec Kerrek et je pense en outre que la solution ne clarifie ni rien ni n'est plus facile de lire / écrire ...
Vous pourrez le rendre préétat avec le concept (pas encore en standard - mais très proche):
http://melpon.org/wandbox/permlink/vjy2u6bpbstusk3u p> sortie: p> omit écrire une liste de paramètres de modèle code>, ITQUACKS est assez explicite, les types
ne sont donc jamais utilisés et que ce n'est que l'interface qui compte code > a lieu. Ce
Je voudrais avoir une sorte d'annotation / vérification de l'interface. Code> a également lieu, l'utilisation du concept vous donnera également un message d'erreur intelligent. P> p>
La syntaxe a changé un peu depuis que ceci a été écrit: principalement enlever bool code> et ajout
auto code> sur les paramètres de fonction.
Nous n'avons besoin que d'écrire une version de la fonction:
Concept Tokable Code> ... Venir à vous dans un TS près de chez vous.
Eh bien, ce n'est pas encore standard mais j'espère que C ++ 17 nous permettra d'utiliser
auto code>
en tant que paramètre de fonction pour faciliter la tâche.@Kerreksb il n'est pas sur le dossier de C ++ 17, non? Peut-être que nous le verrons en 2020. :(
@erip: Vous pouvez demander à votre fournisseur si elles implémentent le TS. Je pense que GCC et Scrang font ou feront bientôt.
@Kerreksb je voulais faire partie de la norme. J'essaie d'écrire de plus en plus de code compatible standard. :)
@NathanOniver écriture automatique dans une fonction normale fait partie des concepts TS. De plus: le concept TS entrera dans la norme finalement et il est déjà implémenté dans GCC 6. Donc, à moins que vous n'ayez besoin de code conformé C ++ 17, vous pourriez probablement l'utiliser.
@Klemensmorgenstern C'est pourquoi j'ai dit que ce n'est pas encore standard. J'essaie de ne pas suggérer de méthodes standard, sauf si le PO ne le demande spécifiquement.
@Nathanoliver: OP est un adulte, il n'ya donc aucune raison de masquer le code non standard ;-) Les réponses contenant des codes non standard sont parfaitement correctes, tant que vous mentionnez clairement l'état non standard. Comme op, vous devriez pouvoir décider de vous-même si vous l'utilisez ou non.