8
votes

Ducceur de canard statique en C ++

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 duck1 et duck2 sera, mais aussi longtemps qu'ils peuvent track () , il compilera et exécutera: < Pré> xxx

mais c'est un peu gênant d'écrire. Quand je ne me soucie absolument pas quels types réels duck1 et Duck2 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 :

  1. J'aimerais omettre d'écrire une liste de paramètres de modèle répétitive et surtout dénuée de sens (imaginez simplement ce qui se passerait s'il y a 7 canards ...)
  2. J'aimerais en faire un peu plus explicite que les types ne sont jamais utilisés et que ce n'est que l'interface qui compte.
  3. J'aimerais avoir une sorte d'annotation / chèque d'interface. Effectuez une certaine manière quelles interface sont attendues derrière le type. (C'est cependant un peu contrastant de dactylographie de canard.)

    C ++ offre toutes les fonctionnalités permettant d'obtenir une ou plusieurs des 3 idées?

    (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.)


8 commentaires

Concept Tokable ... 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 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.


5 Réponses :


5
votes

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 ...)

Pour cela, vous pouvez utiliser des modèles variadiques et faire quelque chose comme ce qui suit: xxx

Démo en direct


2 commentaires

Pourquoi dites-vous d.quack () deux fois?


@Kerreksb Désolé, pouvez-vous en faire un peu plus clair? Voulez-vous dire la marche triviale de la récursion?



11
votes

En ce qui concerne les questions 1 et 2: Depuis C ++ 14, vous pouvez omettre explicite template Boiserie et utilisez 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);


5 commentaires

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 :)



1
votes

# 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)...);
}


1 commentaires

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 ...



1
votes

Vous pourrez le rendre préétat avec le concept (pas encore en standard - mais très proche):

http://melpon.org/wandbox/permlink/vjy2u6bpbstusk3u xxx

sortie: xxx < p> Comme vous pouvez le constater, vous pourrez: omit écrire une liste de paramètres de modèle , ITQUACKS est assez explicite, les types ne sont donc jamais utilisés et que ce n'est que l'interface qui compte a lieu. Ce Je voudrais avoir une sorte d'annotation / vérification de l'interface. a également lieu, l'utilisation du concept vous donnera également un message d'erreur intelligent.


1 commentaires

La syntaxe a changé un peu depuis que ceci a été écrit: principalement enlever bool et ajout auto sur les paramètres de fonction.



0
votes

Nous n'avons besoin que d'écrire une version de la fonction: xxx


0 commentaires