2015-05-09 20 views
5

Aşağıdaki kod düzgün çalışıyor ancak C++ standardının hangi noktalarının geçerli olması gerektiğine karar veremiyorum.C++ İmza ve üye ile üye işlevine işaretçi şablonları

template< class C, class signature > 
void f(signature C::*ptr) { } 

zaman C = A ve signature = void(float, int), fonksiyon f standardının parçaları, şablon ikincisi için geçerlidir hangi dayanarak

void f(void(A::*ptr)(float, int)) 

olacak?

+0

@Daniel Frey evet için anlamak ne tür açıklar. Bütün çalışmaların biliyorum. Ben soruyorum: bu neden çalışıyor? C++ standardında böyle bir şeyin uygun olduğunu nereden okuyabilirim. –

cevap

4

En iyisi bunu tek tek gözden geçirin. belirsizliklerden kaçınmak için, ben

template<class C, class signature> void f(signature C::*ptr) {} 

Tüm tırnak C++ 14 standardının en son çalışma taslağı bakın örnekte farklı şablon argüman isimlerini kullanacağız.

Önce, şablon parametrelerinin nasıl işlendiğini anlamak zorundayız.

[temp.param]/3 olan tanımlayıcı uymayan bir üç nokta Typedef-name

Yani şablon tanımı vardır iki parametre T olmak onun tanımlayıcı tanımlayan A tipi parametreli ve imza.

[dcl.fct: şablon vücutta signature kullanıldığında, bu Typedef daki örnekte olduğu gibi, bir işlev işaret parametresini bildirmek için kullanılabilmektedir

typedef void signature(float, int); 

Typedef nedenle eşdeğerdir ]/12 işlev türü bir typedef işlev bildirimi için kullanılabilir ancak te parametrelerinde bir işlev

tanımlamak için kullanılmayacaktır mplate fonksiyonu, sen signature T::*ptr yazma, standart üyesi önerilerle ilgili neler söyleyecek:

[dcl.mptr] D forma sahiptir bildiride T D yılında/1

nested-name-specifier * attribute-specifier-seq_opt cv-qualifier-seq_opt D1 

ve iç içe-isim-belirteci bir sınıfı ve T D1 bildirgesindeki tanımlayıcısının türünü türetilmiş-declarator-tür listesi T, daha sonra D tanımlayıcısının türü, T türünde sınıf iç içe-adı belirtecinin üyesinetüretilmiş declarator-tür listesi cv-niteleyici-sıralayıcı işaretçisidir. Örneğimizde

, Tsignature, fonksiyon typedef ve D olduğunu C::*ptr olduğunu.

Bu derleyici örnek

void f(void(A::*ptr)(float, int));