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?
Réponses
Trop de publicités?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.
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.
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
etstd::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++.
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.
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.