我正在實作一個雙向鏈表,它以哨兵節點作為其頭部和尾部,比如這個名為List. Node是 中的私有結構List。這個類有一個私有方法Init用于初始化頭尾節點,在List.
template<typename T>
class List {
public:
List() {
Init();
}
...
private:
struct Node {
T data;
Node* prev;
Node* next;
// Constructors
};
size_t size;
Node* head;
Node* tail;
void Init() {
// Codes arise some problem if instances of T have no default constructor.
head = new Node;
tail = new Node;
head->prev = nullptr;
head->next = tail;
tail->prev = head;
tail->next = nullptr;
size = 0;
}
};
現在,問題是,如果 的實體T沒有默認建構式,我無法使用head = new Node;and創建哨兵節點tail = new Node;。該new運營商始終分配一塊記憶體和構造它。當構造Node物件時,它必須使用的一些建構式T初始化data現場Node。
有沒有辦法檢查T我可以使用哪些建構式(除了復制和移動建構式)來構造data型別變數T?或者我可以只初始化prev和 中的next欄位Node,而使該data欄位未初始化?
uj5u.com熱心網友回復:
您的代碼有一個型別 T 應該遵循您需要的概念。
在您的情況下,您希望它是默認可構造的。如果模板的實體化器沒有提供 T 符合,它會得到一個很大的模板錯誤。
您可以在代碼中添加一個 static_assert,以提供更好的訊息(如果您的方法沒有直接使用,請提前提供)
你可以使用:static_assert(is_default_constructible_v). 存在更多變體,如果它不應該拋出......,請參閱檔案
在 C 20 中,您也可以使用概念來限制 T。我對它們并不流利,所以我會留給您找到正確的語法。
還有其他解決方案,例如存盤 std::optional 或在 init 函式上使用可變引數以構造 T。在這種情況下,您可能希望使用std::is_constructible限制代碼。如果您不介意放置新聞,std::aligned_storage也可以使用。一切都取決于你想用這個實作什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/409395.html
標籤:
