Molti anni fa, (almeno per me) il polimorfismo statico del C++ sembrava coerente. Linguaggi come Python fatto affidamento su duck typing, dove si hanno:Perché C++ 1 * ha ancora bisogno della parola chiave template al posto della duck Full Typing
def fn(foo, bar):
foo.baz(bar.bo())
e l'idea era che se "starnazzò" in modo appropriato, è andato tutto bene dal linguaggio.
In C++, al contrario, che avrebbe dovuto spiegare che cosa "animale" era:
void fn(foo_type foo, bar_type bar);
e per "regni di famiglie", si sarebbe esplicitamente necessario utilizzare la parola chiave template
:
template<class Foo, class Bar>
void fn(Foo foo, Bar bar);
Con nuove caratteristiche come auto ...() -> decltype
tipi di ritorno, ma soprattutto generic lambdas, sembra che ci sia qualcosa di molto più simile non-modello di Python-like du ck digitazione:
[] (auto container) { return container.size(); };
La mia domanda, allora, è per questo che è la parola template
ancora bisogno? Perché non abbracciare solo completamente (opzionale) duck typing:
// 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.
Avete esaminato le proposte concetti per C++ 1Z/C++ 2x? – Yakk
@Yakk, grazie - non ho seguito dove sono i concetti. Leggere. –
Arriva, ma non succede tutto in una volta. In C++ 11 abbiamo ottenuto i tipi di ritorno dedotti per lambdas, quindi in C++ 14 li abbiamo ottenuti per tutte le funzioni. In C++ 14 abbiamo ottenuto lambdas generici (cioè i parametri 'auto') e TS Concetti aggiunge lo stesso per le normali funzioni (tale funzione diventa implicitamente un modello di funzione e viene istanziata per gli argomenti forniti). –