2015-05-09 126 views
5

下面的代碼工作正常,但我無法弄清楚基於C++標準的哪些點應該是有效的。C++模板指針與成員函數的簽名和類型

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

C = Asignature = void(float, int),函數f將基於該標準的部分,不模板應用於後者是

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

+0

@Daniel弗雷是。我知道所有的作品。我問:爲什麼這是有效的?我可以在C++標準中讀到哪裏是適合的。 –

回答

4

最好一一瀏覽。爲了避免歧義,我會在例如

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

所有報價指的是C++ 14標準的最新工作草案使用不同的模板參數的名稱。

首先我們需要了解模板參數是如何處理的。

[temp.param]/3 A型參數其標識符不遵循省略號限定 其標識符是一個typedef名

所以你的模板定義有兩個參數T和簽名。當在模板正文使用signature,它因此等同於的typedef

typedef void signature(float, int); 

這typedef的可用於聲明一個函數指針參數,如在例如:

[dcl.fct ]/12功能類型的類型定義也可以用來聲明功能,但應 不能用來定義一個函數

在TE的參數mplate功能,你寫signature T::*ptr,讓我們來看看有什麼標準說,有關成員指針:

[dcl.mptr]/1在聲明T D其中D的形式

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

嵌套名稱說明符表示一個類,並且聲明T D1中的 標識符的類型是派生聲明器類型列表 T,那麼D的標識符的類型是 派生聲明器類型列表cv-qualifier-seq指向T類型的類嵌套名稱說明符的成員的指針-seq

在我們的例子中,Tsignature,功能的typedef,並DC::*ptr

這解釋了編譯器將演繹什麼類型的例子

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