2011-01-05 13 views
6

Qual è il fondamento logico della ricerca di Koenig?Logica per la ricerca di Koenig

Impossibile evitare di pensarlo come qualcosa che rende il codice molto più difficile da leggere e più instabile.

Impossibile definire la ricerca di Koenig in modo che funzioni solo per casi specifici (ad esempio operatori non membri) o quando richiesto esplicitamente?

+0

Non ci ho mai pensato. Quindi anche io voglio saperlo. Buona domanda! – Nawaz

risposta

5

La motivazione originale, IIRC, doveva essere in grado di scrivere

std::cout << 42; 

senza dover qualificare std::operator<<(std::ostream&, int) esplicitamente.

Se si desidera disabilitare la ricerca dipendente dall'argomento, è possibile qualificare esplicitamente il nome della funzione, ad es. utilizzare std::swap anziché swap per impedire che swap venga cercato in qualsiasi spazio dei nomi in cui i suoi argomenti sarebbero stati pubblicati.

ADL può essere utilizzato anche con SFINAE per testare in fase di compilazione se alcune funzioni sono definite per un tipo particolare (ti consentirò di farlo come esercizio, c'è almeno una domanda a riguardo su StackOverflow).

+0

Penso che SFINAE sia stato concepito dopo l'introduzione di ADL. Il mio punto comunque è che mi piacerebbe essere costretto a dire esplicitamente quale spazio dei nomi usare (o dire esplicitamente di applicare ADL). ... Stavo spiegando un pezzo di codice che ho scritto a un mio amico che non parla C++; dopo aver passato dieci minuti a parlare di spazi dei nomi, mi ha chiesto perché, nel mio pezzo di codice, potevo usare una funzione da un altro spazio dei nomi senza renderla esplicita.Ho suonato più o meno come "oh, beh, sì, perché il C++ ha anche quest'altra regola che ..." – peoro

+0

@peoro: C++ ha un sacco di regole strane, e questo sarà peggiore con C++ 0x. Tuttavia, penso che ADL sia meglio evitato chiamando esplicitamente le funzioni membro con 'this->' e usando qualifiche esplicite ogni volta che ha senso. La maggior parte delle volte non è necessario (tranne che con le chiamate alle funzioni membro). E ci sono momenti in cui ADL è fantastico. –

+0

@Alexandre C .: Sì, so che può essere evitato in questo modo, ma questo non risponde perché ADL esiste. Ho pensato (questa è una mia opinione personale, sì) sarebbe stato più semplice e pulito non averlo, ed essere costretto a _avoid_ it. In quali casi è fantastico? Al momento la vedo come una strana regola del C++ che potrebbe essere facilmente evitata in una lingua con una buona sintassi. – peoro

3

Il caso di utilizzo più forte per ADL è per casi come questo.

namespace A 
{ 
    struct S {}; 
    S operator+(const S&, const S&); 
} 

namespace B 
{ 
    A::S test() 
    { 
     A::S a, b; 
     return a + b; 
    } 
} 

È altresì utile per selezionare la funzione corretta swap in codice generico quindi non dovrebbe solamente applicarsi a operator funzioni. È già una parte abbastanza complessa dello standard, rendendo le regole che gli impedivano di lavorare in alcuni casi aggiungerebbe ulteriore complessità, quale sarebbe il guadagno?

Non riesco a pensare a un modo accurato di richiederlo esplicitamente che sarebbe significativamente meno prolisso di chiamare direttamente una funzione in un diverso spazio dei nomi e, in ogni caso, renderebbe le espressioni più complesse.

Stiamo pensando qualcosa tipo: return [[ use_adl ]] (a + b); vs. return A::operator+(a, b);?

+0

In realtà stavo pensando di aggiungere una sorta di parola chiave all'interno della funzione che usa koenig lookup: 'void f (const T & a) {namespaceof (T) :: ...; } '... – peoro

+2

@peroro:' namespaceof (T) 'suona molto come se si stesse specificando un particolare spazio dei nomi in cui cercare; nel qual caso non hai bisogno di ADL. Puoi anche usare un ID qualificato. –

+0

@Charles Bailey: Sì, ma poi la mia domanda è ancora lì. Non sarebbe più semplice (per i compilatori e per lo standard) e più pulito (per i programmatori e per lo standard) avere un operatore come 'namespaceof' invece di ADL e essere forzato ad usare esplicitamente namespace? – peoro

Problemi correlati