C++模板默認參數能不能是模板類本身?
雖然我覺得無法實現,但是想問問有沒有其他的方式解決下面這個問題。
比如我寫了一個Node的模板類,這個類中還有一個指向下一元素的指針,下一個元素可能是Node但也偶爾可能是其他的類,所以我想讓這個指針的類型默認是Node,需要改變的時候再通過模板參數添加。可是讓模板參數是模板類本身應該是不可能的吧,有沒有什麼實現的方法或者其他解決這個問題的方法?用void*嗎?或者換一種說法吧,比如寫一個有一堆不同類型的對象,希望在這些對象總都加入一個指針可以指向其他對象,對象可能會隨機指向不同類型的其他對象,所以希望這個指針可以通用,使用模板實現比較好還是用void*呢?用模板的話應該怎麼實現呢?
首先回答一下題主關心的問題。題主需要的是一個異質鏈表,這要用繼承來實現,不要用模板。Node作為基類,自然Node*就可以指向各種不一樣的子類了。合理的使用設計模式,避免dynamic_cast,就可以寫出完美的代碼。
然後回到題主最初的問題,這當然是不行的。你一開始可能嘗試這麼寫:template&
class Fuck
{
};
template&
class Fuck;
template&
class Fuck
{
};
然後編譯器會報告類型不完整。因為typename T需要的是一個完整的類型,而Fuck是一個返回類型的函數。那麼你可能要想一下,我是不是要使用高級語法?
template& class TFuck&>
class Fuck;
template& class TFuck = Fuck&>
class Fuck
{
};
當你以為自己解決了問題,開始的編譯的時候,編譯器報告說這個Fuck的結構不對。你想了一下突然明白了,Fuck的模板參數類型是template&
template& class&> class TFuck&>
class Fuck;
template& class&> class TFuck = Fuck&>
class Fuck
{
};
於是你陷入了一個死循環,因為定義這樣的一個Fuck,需要嵌套無窮多層template&class&>class&>class。而這種代碼在C++當然是寫不出來的。
當然題主可能會想,那我如果寫成這樣呢?template&
class Fuck;
template&
class Fuck
{
public:
T data;
TFuck* next;
};
先不要想問號那裡怎麼填充,你這個做法實際上就等於把鏈表靜態化了,一個保存10個int的鏈表的首節點類型就會變成:
Fuck&
是不是完全沒有用?
說白了就是有個type* pNext
一會兒pNext=Node&一會兒pNext=Node&
1.type填void
簡單粗暴,同時會失去編程能力因為鬼知道裡面放的究竟是Node&2.type填Node&
推薦閱讀:
※大學可以逃課自主學習嗎?
※求解一個C語言問題?
※在編程和演算法領域,有哪些經典問題?
※有哪些適合實習程序員使用,性能上能媲美 Macbook Pro 的筆記本電腦值得推薦?
※關於c++中用extern引用的變數類型與定義類型不一致的一個疑問?