2010-09-20 16 views
5

Jak można zrzucić funkcje kandydujące (lub realne funkcje lub najlepsze funkcjonalne funkcje) w celu wywołania funkcji?Jak zrzucić kandydatów w funkcji przeciążenia funkcji?

Wiem, że g ++ zapewnia option to dump class hierarchy. (W rzeczywistości program Visual Studio 2010 oferuje podobną opcję, ale jest nieudokumentowany.) Pamiętam, że czytałem coś na ten temat - może na blogu zespołu VC++ - ale nie pamiętam tego wyraźnie.)

Ostatnio czytałem o rozdzielczości przeciążania w szkicu C++ 0x i naprawdę mnie to zawstydziło.

Czy którykolwiek kompilator oferuje opcję zrzutu kandydujących funkcji, wykonalnych funkcji lub najlepszych wykonalnych funkcji?

Uwaga: Kandydat działający w scenariuszu rozwiązywania przeciążenia różni się od kandydujących funkcji błędu kompilatora. Kandydat/żywotna/najlepsza realna funkcja w scenariuszu rozwiązywania przeciążenia ma swoje własne znaczenie. Wiem, że są trzy etapy w rozładowaniu: znajdź funkcje kandydata; znajdź opłacalne funkcje; znajdź najlepsze możliwe funkcje. Zwykle najlepszą możliwą funkcją jest tylko jeden kandydat; w przeciwnym razie wywołanie jest niejednoznaczne. Każdy etap ma swoje własne zasady.

+2

Dlaczego chcesz poznać funkcje kandydujące, które nie są opłacalne? "Jaki problem próbujesz rozwiązać?" –

+0

Jestem po prostu ciekawy, i chcę wiedzieć, jak dokładnie działa rozdzielczość przeciążania – Yuncy

Odpowiedz

1

Najprostszym sposobem zrobienia tego w Visual Studio jest skompilowanie niejednoznacznego połączenia. Kompilator wypisze błąd z listą dostępnych kandydatów. Prawdopodobnie g ++ zrobi to samo.

+0

W tym przypadku dostępne kandydaci porzucone przez błąd kompilatora są najlepszymi realnymi funkcjami, nie są to funkcje kandydata ani realne funkcje w rozdzielczości przeciążania. – Yuncy

2

Nie sądzę, że istnieje jakaś bezpośrednia droga.

Jednym ze sposobów jest sztuczne ukształtowanie konfliktu/niejednoznaczności. Większość kompilatorów emituje błąd z poniższego formularza, wyrzucając listę uznanych kandydatów.

namespace A { 
    void f(int x) {} 
} 
void f(int x) {} 
void f(char x) {} 

using namespace A; 

int main(){ 
    f(2.2); 
} 

G ++ komunikat o błędzie:

 
prog.cpp: In function ‘int main()’: 
prog.cpp:10: error: call of overloaded ‘f(double)’ is ambiguous 
prog.cpp:4: note: candidates are: void f(int) 
prog.cpp:5: note:     void f(char) 
prog.cpp:2: note:     void A::f(int) 
+0

Dostępne tutaj potencjalne funkcje wyjściowe różnią się od funkcji kandydujących w scenariuszu przeciążenia. – Yuncy

+2

Dlaczego tak mówisz? Kandydat to taki, który ma taką samą nazwę jak nazwa funkcji Dodaj inną funkcję 'int f (int x, char x) {} 'w kodzie, który pokazałem powyżej i obserwuj, w jaki sposób raporty gcc są również kandydatami (nawet jeśli nie są opłacalne, co ustalono później) – Chubsdad

2

Jednym ze sposobów, aby zrzucić wszystkie funkcje, które zostały uznane, jest użycie konkretnej nazwy funkcji z zestawem parametrów, które niczego nie pasują:

struct DumpThemAll {}; 

int main(int argc, char* argv[]) 
{ 
    std::cout << DumpThemAll() << std::endl; 
} 

Spowoduje to (normalne) zrzuty wszystkich operator<<, które zostały rozważone dla rozdzielczości przeciążenia. W tym konkretnym przypadku może stać się owłosiony.

Jeśli chcesz zrzucić tylko niektóre określone funkcje, jest to znacznie trudniejsze. Jedynym sposobem, aby to zrobić, jest sztuczne tworzenie niejednoznacznego połączenia, jednak wywołanie jest niejednoznaczne tylko wtedy, gdy funkcja fałszowania, którą podajesz, ma dokładnie ten sam "wynik" niż najlepszy dopasowanie ... więc trudno jest wyobrazić sobie taką funkcję, gdy nie rozumiesz, jak działa ta punktacja (i osobiście, nie rozumiem tego wszystkiego ... jest zbyt wiele reguł ...)

Dodam jednak, że choć prawdopodobnie jest ich tylko garstka osób, które potrafią wskazać zasady przeciążania z góry, a może nawet nadać mu sens, ogólnie rzecz biorąc nie przeszkadza ci to w pracy, ponieważ standard stara się rozwiązać każdy możliwy przypadek, podczas gdy ty pracujesz tylko z parą z nich.

Ponadto nadużywanie funkcji/operatora powoduje, że program staje się nieczytelny, ponieważ jest to tajemne dla ludzi (szczególnie, że dotyczy to konkretnych plików zawartych w bieżącej jednostce tłumaczeniowej).

Powiązane problemy