2009-08-03 13 views
8

Ultimamente mi sono entusiasmato del supporto per lambda in VC2010. Sto lentamente iniziando a cogliere appieno il potenziale di questa funzionalità nel trasformare C++ in qualcosa di molto meglio.Piani di libreria per C++ 0x?

Ma poi ho capito che questo potenziale dipende in gran parte dal supporto del flusso principale di lambda nelle librerie quotidiane come boost e QT.
Qualcuno sa se ci sono piani per estendere queste librerie con le nuove funzionalità di C++ 0x?

lambda sostituisce praticamente la necessità di boost :: lambda e tutto ciò che è in boost che interagisce con esso. QT potrebbe aggiungere il supporto per lambda in tutta la loro contenitore e forse anche come un modo alternativo di definire SLOT s

+1

'boost :: obiettivi bind' un'altra cosa, non di essere sostituito da lambda. 'std :: bind' farà il suo lavoro di funzioni vincolanti. Invece, lambda sostituirà parzialmente la funzionalità in 'boost :: lambda' (e il suo successore, boost :: phoenix, afaik). Ciò che attualmente lambda non può fare è il polimorfismo di 'boost :: lambda'.La possibilità di creare funzioni che funzionano su qualsiasi tipo di argomento: '_1 ++' incrementa qualsiasi tipo di argomento, mentre '[] (int & a) {a ++; } 'può solo incrementare int. Ho sentito ora che i concetti sono fuori dal C++, i lambda polimorfi sono di nuovo un'opzione. –

+1

@litb: è interessante, hai qualche link al materiale che spiega perché i concetti erano un ostacolo ai lambda con i parametri del tipo? –

+0

Non conosco un documento che lo discuta in dettaglio, ma ho letto su usenet. Immagino, avrebbe dovuto esserci un modo per dire "richiede Blah [] (T t) {...}" o qualcosa del genere per rendere vincolato il modello 'operator()' di lambda. Un altro problema potrebbe essere che in un modello vincolato è possibile chiamare solo altri modelli vincolati per consentire la definizione di una definizione del modello. Quindi con un lambda che ha un semplice 'operatore()' non contenuto, non è possibile usarlo in un modello vincolato come questo: 'modello void f (T t) {([] (u) {...}) (t); } '. –

risposta

6

Lambdas si adatta già molto bene alle librerie esistenti, ovunque una funzione accetta un oggetto funzione di un tipo dato da un parametro modello.

Questa è una delle grandi cose su di loro - sono un classico esempio di una funzionalità linguistica che codifica la pratica esistente in una sintassi elegante.

Ovviamente la libreria lambda di boost diventa ridondante, ma ciò significa che non richiede l'aggiunta di nuove funzionalità.

+0

Un commento dal down-motor potrebbe essere interessante (ma, ripeto, potrebbe non esserlo). –

+0

Heh, il tuo voto di voto diminuisce? : P – GManNickG

3

Le probabilità sono tali librerie sono in corso di aspettare fino a quando c'è un adeguato supporto compilatore per le pertinenti C++ 0x caratteristiche, e non ci preoccupiamo molto finché i compilatori mainstream non lo supportano. Non trattenere il respiro.

4

Non vedo come l'utilizzo di lambda dipenda dal supporto delle biblioteche. Lambdas elimina la necessità di creare molte classi solo per racchiudere diversi piccoli algoritmi e adattarsi perfettamente con altre funzionalità di linguaggio/libreria (std::function viene in mente). Ovunque si passasse un oggetto funzione o un puntatore a funzione, è possibile utilizzare anche lambda.

Quindi aggiungono principalmente un'altra alternativa per l'utilizzo del codice e delle librerie esistenti. L'unico modo che vedo per le librerie di supportare meglio lambda è usare approcci più funzionali.

0

La maggior parte delle librerie utilizza i puntatori funzione standard per le richiamate. I lambda C++ 0x possono essere usati come puntatori di funzioni, quindi la maggior parte delle librerie non dovrebbe essere modificata. Altre librerie utilizzano modelli in modo che possano prendere qualsiasi oggetto chiamabile (ad esempio, std::foreach non dovrebbe essere modificato).

L'unica altra caratteristica C++ 0x che posso pensare che le librerie potrebbero cambiare è l'utilizzo di enums fortemente tipizzato. Inoltre, le librerie potrebbero iniziare a utilizzare i modelli extern per ridurre i tempi di compilazione.

+3

i riferimenti di valore r avranno (o dovrebbero) avere un grande impatto - molte librerie hanno classi che fungono da wrapper attorno a risorse che sono costose da costruire e l'aggiunta di operazioni di spostamento accelera immediatamente molti programmi scritti con tali librerie (o rendere i programmi corretti molto più leggibili). –

+0

Ah, sì, mi sono dimenticato dei riferimenti al valore R. Immagino che sarebbero usati molto in librerie come Boost, ma non tanto nelle librerie orientate alle applicazioni come Qt.Inoltre, nella maggior parte dei casi, non interromperà l'interfaccia, quindi non dovrai mai preoccuparti di loro (eccetto se li usi nel tuo codice). – Zifre

+1

Non è possibile assegnare il risultato di un'espressione lambda a un puntatore di funzione. – sellibitze

1

Questo NON è vero, non è possibile sostituire boost :: lambda con C++ 0x lambda. Vedere here per alcuni motivi (su boost bind, ma penso che la maggior parte di esso trasferimenti)

Inoltre, @daniel this potrebbe aiutarti a iniziare a utilizzare le funzioni lambda/boost bind per gli slot. Rende la mia vita incredibilmente facile.

Inoltre, @ litb da mie fonti, lambda non stanno andando essere cambiato (argh)

+0

grazie mille per il link cheez! –

+0

per quanto riguarda il brutto problema di chiusura su una variabile di loop e dover fare una copia. Usa invece 'for_each' per scorrere il' vector '. Passa a lambda per fungere da "blocco del ciclo", ovvero 'for_each (d.begin(), d.end(), [&] (int i) {/ * il corpo del loop va qui * /});' Ora che 'i' ora può essere catturato in modo sicuro in base al valore dato che è già una copia e quindi all'interno del ciclo si direbbe' funcs.push_back ([=]() {return i + 5;}); '. Lo stesso problema/soluzione si presenta in C# e JavaScript. –