C++ ha ADL (Argument Dependent Lookup) mediante il quale, come descrive il nome, il contesto (spazio dei nomi) di una funzione può essere implicito dal contesto (spazio dei nomi) di (qualsiasi) argomento (i).Soluzione alternativa per l'inverso della ricerca dipendente dall'argomento?
fun(a); // if the type of a is in namespace ns deduce ns::f if available
La mia domanda è se il contrario è anche possibile da qualche tecnica? In senso inverso intendo se il contesto (spazio dei nomi) può essere dedotto dal contesto della funzione chiamata. Una sorta di "funzione di ricerca dipendente" (FDL). Codice falso:
ns::fun(a); // deduce ns::a if available
Non riesco a capire un modo per farlo. Questa limitazione è particolarmente fastidiosa per i valori enum
utilizzati per codificare le opzioni delle funzioni. Mi piacerebbe sapere se esiste una tecnica per simulare questa caratteristica (anche il C++ 11 andrebbe bene). Codice Falso:
ns::fun(Saturday, Tuesday); // Saturday/Tuesday are enum values in namespace ns;
soprattutto se v'è una soluzione per enum
s.
Questo codice illustra il problema:
namespace longname{
class A{};
void fun(A const& a){}
A global_a;
enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday};
void gun(Days d1, Days d2){}
}
int main(){
longname::A a;
fun(a); // cool, longname::fun(a) not necessary, fun is deduced from context
longname::fun(global_a); // error, not cool, global_a context not deduced,
// must use then longname::fun(longname::global_a)
longname::gun(Saturday, Tuesday); // error, particularly not cool, the Saturday is not deduced from context
// must use then longname::gun(longname::Saturday, longname::Tuesday)
// or at best gun(longname::Saturday, longname::Tuesday)
}
EDIT: @jrok ha suggerito una soluzione basata sulla definizione dello spazio dei nomi nidificato. Per il caso enum
, ottengo questo codice. Che ha ancora un po 'di rumore (non c'è davvero nessuna ricerca "dipendente") ma è un miglioramento.
namespace longname{
namespace days{
enum _ { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday};
}
void gun(days::_ d1, days::_ d2){}
}
int main(){
using namespace longname::days; // some noise still here
longname::gun(Saturday, Tuesday);
}
non sto usando enum class
perché poi Saturday
, Sunday
, ecc non può essere Brough direttamente nel campo di applicazione (in realtà using longname::days::_
mi avrebbe dato un errore di compilazione)
ok, dopo aver presentato la mia domanda: Ho una domanda relativa sul pannello di destra http://stackoverflow.com/questions/14163667/why-does-c11-not-support-name-lookup-like- questo? rq = 1. Probabilmente, la differenza qui è che non sto mettendo in discussione la lingua, ma sto cercando una tecnica alternativa. – alfC
Soluzione alternativa: inserire l'enum in uno spazio dei nomi annidato e pronunciare 'using namespace longname :: nested;' in 'main'. – jrok
@jrok, cool, che si avvicina a una soluzione (ho aggiunto il tuo suggerimento alla domanda). – alfC