41 votes

Quelle est la relation entre C++ template et duck-typing?

Pour moi, C++ template utilisé l'idée de duck-typing, est-ce exact? Signifie-t-il tous les types génériques référencé dans la classe de modèle ou de la méthode sont de canard type?

73voto

tgmath Points 2528

Pour moi C++ templates sont un moment de la compilation de la version de duck-typing. Le compilateur compile par exemple, la Classe et aussi longtemps que votre Canard a tous besoin de types il va instancier une classe.

Si quelque chose n'est pas correcte(par exemple, constructeur de copie manquante) la compilation échoue. La contrepartie dans la vraie ducktyping est un échec lorsque vous appelez une fonction avec un non type de canard. Et ici, il risquerait de se produire lors de l'exécution.

14voto

Steve Jessop Points 166970

Duck-typing signifie "s'il a des charlatans comme un canard, et marche comme un canard, alors c'est un canard". Il n'a pas une définition formelle de l'informatique pour nous de comparer C++ contre.

C++ n'est pas identique à (par exemple) Python, bien sûr, mais ils ont tous deux une concept implicitement définis par les interfaces. L'interface d'un objet utilisé comme une fonction Python argument est ce que la fonction fait. L'interface d'un type utilisé en tant que C++ argument de modèle est celui que le modèle ne avec les objets de ce type. C'est la similitude, c'est le terrain sur lequel les modèles C++ devrait être évaluée.

En outre, en raison de l'argument de modèle déduction, en C++, vous pouvez essayer de passer de tout objet ancien, et le compilateur va déterminer si elle peut instancier la fonction de modèle.

Une différence, c'est qu'en C++, si l'argument n'a pas de couac, alors le compilateur objets. En Python, seuls les objets de l'exécution (et seulement si la fonction est en fait appelé, s'il y a des instructions conditionnelles dans le code). C'est une différence dans la nature de l'interface exigé d'un objet/type - en C++, soit le modèle exige qu'une expression donnée est valide ou qu'il n'a pas l'exiger. En Python, les expressions valides peuvent dépendre des valeurs de l'exécution de la précédente expression nécessaire. Donc en Python, vous pouvez demander pour un objet qui soit charlatans fort ou doucement, et si il charlatans fort il doit marcher aussi. En C++, vous pouvez le faire par un conditionnel dynamic_cast, et si le volume est une constante de compilation vous pourriez faire de spécialisations de modèle, mais vous ne pouvez pas utiliser le typage statique-à-dire qu'un canard ne doit marcher si quack_volume() retours loud. Et bien sûr en Python les interfaces ne peuvent pas vraiment être "nécessaire" - comportement si une méthode n'est pas présent, c'est jeter une exception, et il pourrait être possible de document et de garantie de l'appelant comportement si cela arrive.

À vous de décider si vous définissez "duck typing" de sorte que cette différence signifie C++ ne l'a pas.

13voto

In silico Points 30778

Pour moi, C++ template utilisé l'idée de duck-typing, est-ce exact?

Non, C++ templates sont utilisés pour mettre en œuvre le code générique. C'est, si vous disposez d'un code qui peut travailler avec plus d'un type, vous n'avez pas à le dupliquer pour chaque type. Des choses comme std::vector et std::list sont des exemples évidents dans l'action. Les modèles C++ ont été victimes d'abus dans d'autres choses à faire, mais genericity a l'intention d'origine.

Signifie-t-il tous les types génériques référencé dans la classe de modèle ou méthode sont de canard type?

Non, ils sont juste "normal" des types comme tout autre type en C++. Ils sont tout simplement pas connu jusqu'à ce que le modèle est effectivement instancié.

Cependant, les modèles peuvent être utilisés pour mettre en place quelque chose comme duck-typing. Les itérateurs sont un exemple. Prenons cette fonction:

template<class InputIterator, class OutputIterator>
    OutputIterator copy(InputIterator first, InputIterator last,
                        OutputIterator result)
{
    while (first!=last) *result++ = *first++;
    return result;
}

Notez que l' copy fonction peut accepter les arguments de tout type, comme le long de la mise en oeuvre de l'opérateur d'inégalité, l'opérateur de déréférencement, et le suffixe opérateur d'incrémentation. C'est probablement près de duck-typing que vous aurez en C++.

5voto

eran Points 12628

Pas exactement. Canard types (type dynamique de style), ne cédera jamais au moment de la compilation type d'erreurs parce qu'ils n'ont tout simplement pas n'importe quel type. Avec les modèles, vous n'avez pas de types jusqu'à ce que vous instancier le modèle. Une fois que vous faites, les variables de types distincts, et vous permettra en effet d'obtenir des erreurs de compilation.

Aussi, avec le canard de types, vous pouvez avoir un point variable de types d'objets différents, parce que les variables ont pas de types. Ce n'est pas possible avec les modèles - une fois que vous les instancier, les variables ont un seul type spécifique.

Ils sont similaires, bien que, dans les contraintes sont implicites: seules les fonctions sont contrôlées. Par opposition, par exemple, polymorphe pointeurs, le type réel n'a pas d'importance.

4voto

sharptooth Points 93379

Oui, en quelque sorte, si par exemple, tapez X a AddRef(), Release() et QueryInterface() méthodes avec des signatures appropriées, il peut être utilisé comme un objet COM avec CComPtr classe de modèle. Mais ce n'est pas complète duck-typing - type de vérification est toujours appliquée pour les paramètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X