2010-09-20 9 views
5

Bir işlev çağrısı için aday işlevlerini (veya geçerli işlevleri veya en iyi uygulanabilir işlevleri) nasıl çöpe atabilirim?Adaylar fonksiyon aşırıya kaçmada nasıl kullanılır?

Biliyorum g ++ bir option to dump class hierarchy sağlar. (Aslında, Visual Studio 2010 benzer bir seçenek sunar, ancak belgesizdir.Bununla ilgili bir şeyler okumayı hatırlıyorum - belki VC++ ekip blogunda - ama bunu açıkça hatırlayamıyorum.)

Son zamanlarda, okuyordum C++ 0x taslağında aşırı yük çözünürlüğü hakkında ve gerçekten beni utandırdı.

Herhangi bir derleyici, aday işlevleri, uygulanabilir işlevleri veya en iyi uygulanabilir işlevleri dökmek için bir seçenek sunar mı?

Not: Aşırı yük çözme senaryosundaki aday işlevler, derleyici hatasının aday işlevlerinden farklıdır. Aşırı yük çözme senaryosunda aday/uygulanabilir/en iyi uygulanabilir işlev kendi anlamlarına sahiptir. Aşırı yük çözünürlüğünde üç aşama olduğunu biliyorum: aday fonksiyonları bulmak; uygulanabilir fonksiyonları bulmak; en iyi canlı fonksiyonları bulun. Normalde, en iyi canlı fonksiyon sadece bir adaydır; aksi halde çağrı belirsizdir. Her aşamada kendi kuralları vardır.

+2

Niçin uygun olmayan aday işlevleri bilmek istiyorsunuz? "Ne problemi çözmeye çalışıyorsun?" –

+0

Sadece merak ediyorum ve aşırı yük çözünürlüğünün tam olarak nasıl çalıştığını bilmek istiyorum. – Yuncy

cevap

1

Visual Studio'da bunu yapmanın en kolay yolu, belirsiz bir çağrı derlemektir. Derleyici, mevcut adayların listesiyle bir hata yazacaktır. Muhtemelen g ++ aynı şeyi yapar.

+0

Bu durumda, derleyici hatası tarafından boşaltılan mevcut adaylar en iyi uygulanabilir işlevlerdir. Aşırı yük çözünürlüğünde aday işlevler veya uygulanabilir işlevler değildir. – Yuncy

2

Doğrudan bir yol olduğunu düşünmüyorum. Bir yol, yapay olarak bir anlaşmazlık/belirsizlik yaratmanın yollarından biridir. Çoğu derleyici, kabul edilen adayların listesini çıkararak aşağıdaki formda bir hata yayar.

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

using namespace A; 

int main(){ 
    f(2.2); 
} 

G ++ hata iletisi: düşünülmüştür tüm fonksiyonları dökümü

 
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

Çıktı adayı işlevleri, aşırı yük çözme senaryosundaki aday fonksiyonlar teriminden farklıdır. – Yuncy

+2

Neden böyle diyorsunuz? Aday, işlevin adıyla aynı ada sahip olanıdır. Başka bir işlev ekleyin. int x, char x) {} 'yukarda gösterdiğim kodda gcc'nin bir aday olarak da (daha sonra belirlenecek uygun olmasa bile) nasıl olduğunu rapor ettiğini gözlemleyin. – Chubsdad

2

bir yolu, bir şey uymayacak parametreleri kümesi ile belirli bir işlev adı kullanmaktır:

struct DumpThemAll {}; 

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

Bu, (genellikle) aşırı yüklenme çözünürlüğü için düşünülen tüm operator<< dökülecektir. Bu özel örnek için kıllı olabilir.

Sadece bazı belirli işlevleri dökmek istiyorsanız, çok daha zordur. Bunu yapmanın tek yolu yapay olarak belirsiz bir çağrı oluşturmak olacaktır, ancak bir çağrı sadece belirttiğiniz sahte işlev en iyi eşleşmeden tam olarak aynı "skor" a sahipse ... belirsizdir, bu yüzden böyle bir işlevi tasarlamak zor bu puanlama işinin nasıl olduğunu anlamıyorsunuz (ve kişisel olarak, hepsini anlamıyorum ... sadece çok fazla kural var ...)

Ancak, muhtemelen sadece bir avuç olsa da aşırı yük kurallarını kafasının üstünden ya da belki de bundan anlam ifade edebilen kişilerden, genel olarak çalışmanızı engellemez, çünkü standart denemeler için sadece bir çiftle çalışırken her olası vakayı ele alır. onların Ayrıca, işlevi/operatörün aşırı yüklenmesini kötüye kullanma, programınızın insanlara yönelik olarak okunamaz hale getirilmesini sağlar (özellikle geçerli çeviri birimine dahil edilen dosyaların özelliklerine bağlı olarak).