[開源世界]如何讓C++的模板類支持多參數但同名?

在C++中,根據函數參數個數的不一樣區分函數重載再常見不過了。也就是說,向下面這樣的函數重載在C++中是合法的。函數

int max(int a, int b) { return a>b?a:b; }spa

int max(int a, int b, int c) { return max(a,b)>max(b,c)?max(a,b):max(b,c); }debug

當咱們把這條經驗擴展到C++的模板系統時,它仍然是有效的。指針

template<typename _T> void debug(_T a, std::string b) { cout<<a<<b; }code

template<typename _T, typename _T1> void debug(_T a, _T1 b, std::string c) { cout<<a<<b<<c; }繼承

可是當咱們進一步將這條經驗試圖擴展到C++的類模板時,它失效了。也就是說,像下面這樣的模板類在C++中是非法的(VC++編譯器報告Debug模板參數太多)。get

template<typename _T> struct Debug {編譯器

_T _a;string

Debug(_T a) : _a(a) {}it

void debug(std::string s) { cout<<_a<<s; }

};

template<typename _T, typename _T1> struct Debug {

_T _a;

_T1 _b;

Debug(_T a, _T1 b) : _a(a), _b(b) {}

void debug(std::string s) { cout<<_a<<_b<<s; }

};

爲了可以讓上面的定義在C++中變得合法,咱們須要將各自的命名後面加上當前模板參數的個數(這是通常作法)。看起來就像下面這樣。

template<typename _T> struct Debug0 {

void debug(_T a,std::string s) { cout<<a<<s; }

};

template<typename _T, typename _T1> struct Debug1 {

void debug(_T a,_T1 b,std::string s) { cout<<a<<b<<s; }

};

然而,咱們真的找不到一種方法可以實現上述意圖嗎?答案多是否認的。事實上在C++的模板規則中有這樣的一條實現:你能夠從一堆看起來同樣的模板類中選擇一個看起來符合的類而後繼承它。也就是說,咱們可以實現這樣的一種形式:

template<typename _T> struct Debug : public one_struct_in_( Debug0, Debug1) {};

它的實現就須要本文將要介紹的模板參數系統。我認爲這種技術的核心在於將函數指針的各部分的類型分開。也就是說,對一個模板類輸入以下參數時,

Debug<void(int,int)>

可以得到以下的事實成立,

Debug<void(int,int)> : Debug1<int,int>

或者,對一個模板類輸入以下參數時,

Debug<void(int)>

可以得到以下的事實成立,

Debug<void(int)> : Debug0<int>

客戶端能夠實現像下面這樣的使用體驗,

Debug<void(int)> a;

a.debug(3,"0");

Debug<void(int,string)> b;

b.debug(3, "4","0");

若是讀者對這種技術感興趣的話,請移步下面的網址下載示例程序。

https://tmplargs.codeplex.com/

順便說一句,這個技術是徹底開源的。

相關文章
相關標籤/搜索