下面的代碼工作正常,但我無法弄清楚基於C++標準的哪些點應該是有效的。C++模板指針與成員函數的簽名和類型
template< class C, class signature >
void f(signature C::*ptr) { }
當C = A
和signature = void(float, int)
,函數f將基於該標準的部分,不模板應用於後者是
void f(void(A::*ptr)(float, int))
?
下面的代碼工作正常,但我無法弄清楚基於C++標準的哪些點應該是有效的。C++模板指針與成員函數的簽名和類型
template< class C, class signature >
void f(signature C::*ptr) { }
當C = A
和signature = void(float, int)
,函數f將基於該標準的部分,不模板應用於後者是
void f(void(A::*ptr)(float, int))
?
最好一一瀏覽。爲了避免歧義,我會在例如
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。
在我們的例子中,T
是signature
,功能的typedef,並D
是C::*ptr
。
這解釋了編譯器將演繹什麼類型的例子
void f(void(A::*ptr)(float, int));
@Daniel弗雷是。我知道所有的作品。我問:爲什麼這是有效的?我可以在C++標準中讀到哪裏是適合的。 –