2016-01-28 21 views
9

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

Avete esaminato le proposte concetti per C++ 1Z/C++ 2x? – Yakk

+0

@Yakk, grazie - non ho seguito dove sono i concetti. Leggere. –

+3

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

risposta

10

In realtà è quasi alla porta come parte della funzione Concepts, e alcuni compilatori già applicarla! Ad esempio, con GCC 4.9, se si specifica -std=c++1y, si può effettivamente compilare ed eseguire il seguente:

auto print_arg(auto arg) { 
    std::cout << arg; 
} 
+0

Grazie! non ne era affatto a conoscenza. –

+1

E dopo questo ci sbarazziamo della parola chiave 'auto' :) – Pierre

+2

@Pierre C'è anche qualche discussione in corso, l'ultima volta che ho controllato, semplificando la gamma basata su per semplicemente' for (v: V) 'che sarebbe probabilmente equivale a 'for (auto && v: V)'. –