類的成員作模板的非型別引數
阿新 • • 發佈:2021-01-29
技術標籤:C++ 模板超程式設計指標類c++
模板引數擴充套件
我們前面提到:我們不可以將自定義類型別作為非型別模板引數,但是我們想想“可不可以把類的靜態/非靜態成員部分作為非型別模板引數呢”?
① 將類型別的非靜態成員作為非型別模板引數
#include<iostream> usingnamespacestd; classStudent { public: intage; public: Student():age(0){}; voidShowInf(); }; voidStudent::ShowInf() { cout<<this->age<<endl; } template<typenameT,typenameF> voidTest(T&obj,FFunc) { (obj.*Func)(); } intmain() { Studentobj; Test(obj,&Student::ShowInf); }
注意:普通成員函式不能離開類物件而存在,因此我們必須在函式中傳入一個類物件,讓這個類物件去呼叫類的普通成員函式。
② 將類型別的靜態成員函式作為模板的非型別引數
#include<iostream> usingnamespacestd; classStudent { public: staticintage; public: staticvoidShowInf(); }; intStudent::age=0; voidStudent::ShowInf() { cout<<Student::age<<endl; } template<typenameF> voidTest(FFunc) { Func(); } intmain() { Test(&Student::ShowInf); }
注意:由於靜態成員函式不需要依賴於類物件,因此我們可以把靜態成員函式當作普通函式來看待。
③ 將類的公有成員資料作為非型別模板引數
#include<iostream> usingnamespacestd; classStudent { public: intage; public: Student():age(0){}; }; template<intStudent::*obj> voidShowInf() { cout<<obj<<endl; } intmain() { ShowInf<&Student::age>();// 輸出1而非我們想看到的0 }
注意:
為何輸出結果不同,因為“成員指標”並不是一個確定的地址而是相對於類的this指標的偏移量,詳見:
④ 將類的靜態成員資料作為模板的非型別引數
#include<iostream>
usingnamespacestd;
classStudent
{
public:
staticintage;
};
intStudent::age=0;
template<int&obj>// 切記要加&引用
voidShowInf()
{
cout<<obj<<endl;
}
intmain()
{
ShowInf<Student::age>();
}
注意:切記要加&引用!
我們只能通過引用/指標來訪問靜態變數,我們使用指標在訪問一次靜態成員變數:
#include<iostream>
usingnamespacestd;
classStudent
{
public:
staticintage;
};
intStudent::age=0;
template<int*obj>//引數為指標
voidShowInf()
{
cout<<*obj<<endl;
}
intmain()
{
ShowInf<&Student::age>();
}
關於static靜態成員的詳細解析: