1. 程式人生 > 其它 >類的成員作模板的非型別引數

類的成員作模板的非型別引數

技術標籤: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靜態成員的詳細解析:

static靜態成員詳解