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
, T
signature
, fonksiyon typedef ve D
olduğunu C::*ptr
olduğunu.
Bu derleyici örnek
void f(void(A::*ptr)(float, int));
@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. –