Il y a plusieurs années, (au moins pour moi) le polymorphisme C++ statique semblait cohérent. Les langages tels que Python compté sur duck typing, où vous avez:Pourquoi C++ 1 * nécessite-t-il toujours le mot-clé template au lieu de la frappe complète
def fn(foo, bar):
foo.baz(bar.bo())
et l'idée était que si elle « cancanait » de façon appropriée, il était très bien par la langue.
En C++, à l'inverse, vous auriez à expliquer ce « animal » était:
void fn(foo_type foo, bar_type bar);
et pour « royaumes de familles », vous auriez besoin explicitement d'utiliser le mot-clé template
:
template<class Foo, class Bar>
void fn(Foo foo, Bar bar);
Avec de nouvelles fonctionnalités comme auto ...() -> decltype
types de retour, mais surtout generic lambdas, il semble y avoir quelque chose de beaucoup plus comme non-modèle comme Python du ck frappe:
[] (auto container) { return container.size(); };
Ma question est donc pourquoi le mot-clé template
encore nécessaire? Pourquoi ne pas simplement embrasser pleinement (en option) canard tapant:
// Takes a foo_type and a bar_type
void fn(foo_type foo, bar_type bar);
// Takes some "foo-quacking" type, and a bar_type
void fn(auto foo, bar_type bar);
// Etc.
Avez-vous examiné les propositions de concepts pour 1Z C++/C++ 2x? – Yakk
@Yakk, merci - Je n'ai pas suivi où sont les concepts. Va lire. –
Ça arrive, mais tout ne se passe pas en même temps. En C++ 11, nous avons obtenu des types de retour déduits pour lambdas, puis en C++ 14 nous les avons obtenus pour toutes les fonctions. En C++ 14, nous avons obtenu des lambdas génériques (c'est-à-dire des paramètres 'auto') et les concepts TS ajoutent la même chose pour les fonctions normales (une telle fonction devient implicitement un modèle de fonction et est instanciée pour les arguments fournis). –