標籤:

C++模板默認參數能不能是模板類本身?

雖然我覺得無法實現,但是想問問有沒有其他的方式解決下面這個問題。

比如我寫了一個Node的模板類,這個類中還有一個指向下一元素的指針,下一個元素可能是Node但也偶爾可能是其他的類,所以我想讓這個指針的類型默認是Node,需要改變的時候再通過模板參數添加。可是讓模板參數是模板類本身應該是不可能的吧,有沒有什麼實現的方法或者其他解決這個問題的方法?用void*嗎?

或者換一種說法吧,比如寫一個有一堆不同類型的對象,希望在這些對象總都加入一個指針可以指向其他對象,對象可能會隨機指向不同類型的其他對象,所以希望這個指針可以通用,使用模板實現比較好還是用void*呢?用模板的話應該怎麼實現呢?


首先回答一下題主關心的問題。題主需要的是一個異質鏈表,這要用繼承來實現,不要用模板。Node作為基類,自然Node*就可以指向各種不一樣的子類了。合理的使用設計模式,避免dynamic_cast,就可以寫出完美的代碼。

然後回到題主最初的問題,這當然是不行的。你一開始可能嘗試這麼寫:

template&
class Fuck
{
};

然後你發現編譯器會報錯,說找不到Fuck,所以你覺得應該加上一個向前聲明:

template&
class Fuck;

template&
class Fuck
{
};

然後編譯器會報告類型不完整。因為typename T需要的是一個完整的類型,而Fuck是一個返回類型的函數。那麼你可能要想一下,我是不是要使用高級語法?

template& class TFuck&>
class Fuck;

template& class TFuck = Fuck&>
class Fuck
{
};

當你以為自己解決了問題,開始的編譯的時候,編譯器報告說這個Fuck的結構不對。你想了一下突然明白了,Fuck的模板參數類型是template& class TFuck,那麼我應該把東西改成這樣?

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&* xxx;

一會兒pNext=Node&* yyy;

一會兒pNext=Node&* zzz;

問type填什麼?

1.type填void

簡單粗暴,同時會失去編程能力

因為鬼知道裡面放的究竟是Node&還是Node&還是Node&?

2.type填Node&,warapper是一個能包含任意類型的class(類似_variant_t這種)

不是不行,前提是warapper真的可以包任意類型...並且能執行題主需要的操作

這相當於把活全部交給了warapper

3.type填BaseNode,然後Node繼承BaseNode

正規的做法,可以在BaseNode里定義一系列的介面來完成各種需求

Node&,Node&,Node&如果有特殊行為可以特化模版


推薦閱讀:

大學可以逃課自主學習嗎?
求解一個C語言問題?
在編程和演算法領域,有哪些經典問題?
有哪些適合實習程序員使用,性能上能媲美 Macbook Pro 的筆記本電腦值得推薦?
關於c++中用extern引用的變數類型與定義類型不一致的一個疑問?

TAG:編程 | C | 模板C |