Sto cercando di utilizzare fancy -std = C++ 14 caratteristiche per implementare il combinatore "mappa" che vedi nei linguaggi funzionali (da non confondere con std :: map). Il mio obiettivo finale è scrivere un'intestazione "pattern di facciata" per la programmazione funzionale che mi permetta di dimenticare gli effetti collaterali e gli iteratori la maggior parte del tempo. Ho trovato un post da una persona con la stessa mentalità allo https://gist.github.com/phatak-dev/766eccf8c72484ad623b. La versione di Madhukara della mappa sembraCombinatore di mappe C++ funzionale con auto
template <typename Collection,typename unop>
Collection map(Collection col,unop op) {
std::transform(col.begin(),col.end(),col.begin(),op);
return col;
}
Sembra funzionare perfettamente fino a quando non chiedere qualcosa di stupido, ma il tipo di ritorno deve essere la stessa della raccolta di input. Il mio tentativo di generalizzare ad avere dominio e la gamma di tipi diversi è il seguente:
template <typename Collection, typename function>
auto map(function f, Collection c) {
auto result;
std::transform(c.begin(),c.end(),result.begin(),f);
return result;
}
Questo non si compila, ma si spera che sia chiaro a qualcuno quello che sto cercando di fare ... Voglio inizializzare un vuoto stesso tipo-di-contenitore-come-c di output-type-of-f's, quindi inserire i f(c[i])
s in esso. Il compilatore si lamenta che la dichiarazione di 'risultato automatico' non ha inizializzatore, ma non so come chiedere un vuoto qualunque dei whatevers. C'è un modo per modificare quella linea per farlo fare ciò che sto cercando di fare? Non ho mai provato a fare qualcosa di così esotico con l'auto prima, quindi qualsiasi suggerimento aggiuntivo è benvenuto.
Grazie!
John
EDIT: Ecco un esempio di utilizzo si spera-sensical:
auto first_letter = [](string s) { return s[0]; }
vector<string> words;
words.push_back("hello"); words.push_back("world");
vector<char> first_letters = map(first_letter, words); // {'h','w'}
Edit 2: Ecco un altro approccio che utilizza uno dei pesi massimi "flussi" biblioteca (da non confondere con IO flussi) al l'attuazione del "modello iteratore", come flussi di Java:
http://jscheiny.github.io/Streams/
l'approccio Java: http://tutorials.jenkov.com/java-collections/streams.html
Questo approccio ai flussi consente una maggiore libertà di scelta sui tipi di contenitori (come diversi rispondenti sembrano essere a favore) e una valutazione lenta.
Vorresti un uso di questo per assomigliare? Come può un chiamante specificare se desidera che sia restituito un 'list' o' vector', per esempio? –
Mi spiace di non aver capito bene e me ne sono reso conto immediatamente, ma mi hai chiesto prima di editare. Mi piacerebbe che il contenitore di output fosse lo stesso del contenitore di input, ma non necessariamente gli stessi tipi di contenuto. –
E come si popolerebbe 'result' se inizia vuoto e non si conosce l'interfaccia ad esso? Come sapresti chiamare 'push_back',' insert', o qualunque sia la funzione? – PaulMcKenzie