C++ ma ADL (Argument Dependent Lookup), według którego, jak sama nazwa wskazuje, kontekst (przestrzeń nazw) funkcji może być implikowany z kontekstu (przestrzeni nazw) (dowolnego) argumentu (ów).Obejście problemu odwrotnego wywołania zależnego od argumentu?
fun(a); // if the type of a is in namespace ns deduce ns::f if available
Moje pytanie brzmi, czy rewers jest również możliwy za pomocą jakiejś techniki? Odwrotnie mam na myśli, jeśli kontekst (przestrzeń nazw) można wywnioskować z kontekstu wywołanej funkcji. Jakieś "Wyszukiwanie zależne od funkcji" (FDL). Fałszywy kod:
ns::fun(a); // deduce ns::a if available
Nie mogę znaleźć sposobu na zrobienie tego. To ograniczenie jest szczególnie denerwujące w przypadku kodowania funkcji funkcji. Chciałbym wiedzieć, czy istnieje technika symulacji tej funkcji (C++ 11 też byłoby w porządku). Kod Fałszywy:
ns::fun(Saturday, Tuesday); // Saturday/Tuesday are enum values in namespace ns;
Zwłaszcza jeśli istnieje obejście enum
s.
Ten kod ilustruje problem:
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 sugerowane obejście w oparciu o zdefiniowanie nazw zagnieżdżonych. W przypadku enum
otrzymuję ten kod. Które nadal ma trochę hałasu (w rzeczywistości nie ma żadnego "zależnego" wyszukiwania), ale jest to poprawa.
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);
}
nie używam enum class
bo wtedy Saturday
, Sunday
itp nie mogą być przyniesione bezpośrednio w zakres (w rzeczywistości using longname::days::_
dałby mi błąd kompilacji)
ok, po złożeniu moje pytanie: Mam powiązane pytanie na prawym panelu http://stackoverflow.com/questions/14163667/why-does-c11-not-support-name-lookup-like- to? rq = 1. Prawdopodobnie różnica polega na tym, że nie kwestionuję języka, ale szukam obejścia techniki. – alfC
Obejście: Umieść wyliczenie w zagnieżdżonej przestrzeni nazw i powiedz 'using namesname longname :: nested;' in 'main'. – jrok
@jrok, fajnie, to zbliża się do rozwiązania (dodałem Twoją sugestię do pytania). – alfC