2016-07-27 38 views
6

Sade ve temiz üzerinde sevk?Avantajları Normal aşırı yük çözünürlüğü

Bunlar hem derleme zamanı işlemleri doğru mu? Yani sanırım bir 'performans galibi' olmamalı. Ve her etiket gönderme davası, bir dereceye kadar, normal aşırı yüklenmeye (muhtemelen birden fazla tür ekleyerek) yeniden yazılmalı/yeniden oluşturulmalıdır, doğru mu? çalışma ve adayları seçme farklı bir şekilde Kenara

, neden aşırı çözünürlüğü fazla olan ve vakalar içinde sevk etiketi tercih etmeliyiz?

+7

Etiket tabanlı gönderim, – Arunmu

cevap

7

Tag dispatching temelde doğru aşırı fonksiyonu bulmak için kullanılan bir teknikle verilen bir isimdir. Yani, teknik olarak sadece aşırı yük olmaktan başka bir şey değildir.

Boost sitesinden söylemek gerekirse:

Etiket yollama bir tür özelliklerine göre gönderme aşırı işlevini kullanarak bir yoludur ve genellikle özellikleri sınıfları ile elele kullanılır.

Bunu standart kütüphane algorithm başlık dosyasına baştan kullanılan görebilirsiniz. Sadece bir örnek uğruna, iki yönlü erişim (list) sağlayan bir kaptan daha rastgele erişimi sağlayan bir kap üzerinde daha etkili bir şekilde bir çok yapılabilir bir algoritma AlgoX (örneğin vector) olduğu düşünün. Yani, algoritma seçilmesi için Gördüğünüz gibi bu kategoriler esasen farklı türleri gibi aşırı operatör örneği başka bir şey değildir, basit bir akla, iterator_traits

template <typename Iter> 
void AlgoXImpl(Iter first, Iter last, bidirectional_iterator_tag) { 
    //.....Algo specialized to bidirectional iterators 
} 

template <typename Iter> 
void AlgoXImpl(Iter first, Iter last, random_access_iterator_tag) { 
    //.....Algo specialized to random access iterators 
} 

template <typename Iter> 
void AlgoX(Iter first, Iter last) { 
    if (first == last) return; 
    AlgoXImpl(first, last, typename iterator_traits<Iter>::iterator_category()); 
} 

kullanarak sevk etiketi kullanmak istiyorsunuz iterator type birine dayanarak. std::rotate nasıl uygulandığını daha gerçek dünya Örneğin

, dışarı ödeme yapabilirsiniz.

+0

aşırı yükleme ile elde edilir. Etiket gönderiminin yoğun şekilde kullanıldığı gerçeği, neden kullanıldığını sormaz. OP doğru bir şekilde, kontrolleri altındaki tip hiyerarşilerindeki düz metot aşırı yüklemesi ile etkilerinin kolayca elde edilebileceğini not eder. Dolayısıyla, belirleyici argüman gerçekten tip tanımlarından ayrıştırılan özel bir gönderme şemasını uygulamaktır. Cevabımı aşağıya bakın. –

+0

Cevabımın özü temel olarak ilk 4-5 satırdır, STL'de kullanılmaz. – Arunmu

+0

Bu cevabı tamamlamak için büyük bir soru: ** biraz daha hızlı wrt normal aşırı yükleme gönderen etiket mi? ** Ben her ikisi de derleme zamanında uygulanan beri değil, ama hala soruyorum .. sadece emin olmak için. – Dean

2

Etiketler hatta uygun özellik sınıfları aracılığıyla temel ilkel türde de dahil olmak üzere, bir türü ile bağlantılı olabilir. Örneğin, bir iteratör kavramının bir alt işaretini bir işaretçi türü yapmak imkansız olurdu. Bununla birlikte, şablonlanmış bir özellik sınıfı, onu istenen etiketle ilişkilendirebilir. Bu nedenle, etiket bazlı gönderim, ilgili tipler tarafından önceden tanımlanmamış bir gönderim şeması oluşturulmasına izin veren esnekliği arttırır.

İlgili konular