簡體   English   中英

使用std :: experimental :: optional來實現列表

[英]Use std::experimental::optional to implement a list

我想知道是否可以使用std::experimental::optional實現單個(和可能的雙重)鏈表。

template <typename T>
struct node {
    std::experimental::optional<node<T>> next;
    T data;
};

這種設計有哪些優點/缺點? 新的c++1z功能可以用於實現哨兵,還是完全擺脫它們? 這會擴大到n-ary樹嗎?

以這種方式實現鏈接列表是不可能的,因為您的node類型將始終不完整。 這是一個更完整的示例 ,說明了該問題:

#include <iostream>
#include <experimental/optional>

template <typename T>
struct node {
    std::experimental::optional<node<T>> next;
    T data;
};

int main( int, char ** )
{
    std::cout << sizeof( node<int> ) << std::endl;
    return 0;
}

關鍵是optional<T>要求T完成,但在您定義next點時, node是不完整的。 optional<T>需要完整類型的原因是它直接將T存儲在optional對象中,即它不在堆上分配內存。 結果,它必須知道T的大小。 在內部,它包含sizeof( T )的緩沖區。 在內存布局方面,您可以將optional<T>視為

template <class T>
struct optional
{
    bool _containsValue;
    char _buffer[ sizeof( T ) ];
};

但實際上,由於內存對齊要求,它更復雜。

在您的情況下,為了知道optional<node>的大小,它必須知道node的大小,為此必須知道optional<node>的大小。

這是不可能的,因為optional<T>要求T完成。

根據N3672std::optional的提議):

類模板可選對T施加很少的要求:它必須是左值引用類型,或滿足Destructible要求的完整對象類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM