使用std :: experimental :: optional来实现列表

富士

我想知道是否可以使用实现单个(甚至可能是双重)链接列表std::experimental::optional

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

这种设计的优点/缺点是什么?可以使用新c++1z功能来实现前哨功能,还是将它们全部消除?这也会扩展到n元树吗?

马库斯·迈尔(Markus Mayr)

不能以这种方式实现链接列表,因为您的node-type始终是不完整的。这是一个更完整的示例,说明了此问题:

#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是完整的,但在其中定义点nextnode是不完整的。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>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何脱离std :: experimental :: optional?

来自分类Dev

std :: experimental :: optional <T>实现:Constexpr构造函数混淆

来自分类Dev

constexpr函数内部的std :: experimental :: optional

来自分类Dev

std :: experimental :: source_location如何实现?

来自分类Dev

lang不适用于std :: experimental :: optional

来自分类Dev

如何取消初始化std :: experimental :: optional

来自分类Dev

使用std :: experimental :: is_detected_v检测免费的'=='运算符:std类的行为不同

来自分类Dev

带有std :: experimental :: is_detected的奇怪MSVC行为

来自分类Dev

为什么std :: experimental :: filesystem :: path不接受“ *”之类的通配符?

来自分类Dev

包含 <experimental/filesystem> 后未声明“std::filesystem”

来自分类Dev

C ++ VS错误:提供std :: experimental :: filesystem的<experimental / filesystem>标头已被Microsoft弃用,将被删除

来自分类Dev

使用实验功能“交易”。使用“--experimental”标志启用实验功能

来自分类Dev

在Keras顺序模型中使用tf.data.experimental.CsvDataset

来自分类Dev

如何使用android gradle-experimental限制目标平台?

来自分类Dev

设置了--experimental-modules的“无法在模块外部使用导入语句”

来自分类Dev

在Keras顺序模型中使用tf.data.experimental.CsvDataset

来自分类Dev

为什么在 Selenium 中使用 add_experimental_option?

来自分类Dev

为什么要使用链接列表而不是数组或向量实现来实现堆栈或队列?

来自分类Dev

如何使用std :: filesystem实现递归目录和文件列表?

来自分类Dev

如何使用 std::list 作为暴露节点的列表的接口的实现?

来自分类Dev

为什么使用数组而不是链接列表来实现IEnumerable(或IList)?

来自分类Dev

我们可以使用继承来实现链接列表吗?

来自分类Dev

为什么使用数组而不是链接列表来实现IEnumerable(或IList)?

来自分类Dev

为什么clang和GCC不使用xchg来实现std :: swap?

来自分类Dev

使用std :: tuple来实现operator <,=等有效且正确吗?

来自分类Dev

使用std :: optional <A>作为A类的类成员

来自分类Dev

是否使用空的std :: optional <string> UB?

来自分类Dev

为什么我不能在g ++ 4.9.2中使用<experimental / filesystem>?

来自分类Dev

Android Studio 2.0使用gradle-experimental插件中断了ndk的构建

Related 相关文章

  1. 1

    如何脱离std :: experimental :: optional?

  2. 2

    std :: experimental :: optional <T>实现:Constexpr构造函数混淆

  3. 3

    constexpr函数内部的std :: experimental :: optional

  4. 4

    std :: experimental :: source_location如何实现?

  5. 5

    lang不适用于std :: experimental :: optional

  6. 6

    如何取消初始化std :: experimental :: optional

  7. 7

    使用std :: experimental :: is_detected_v检测免费的'=='运算符:std类的行为不同

  8. 8

    带有std :: experimental :: is_detected的奇怪MSVC行为

  9. 9

    为什么std :: experimental :: filesystem :: path不接受“ *”之类的通配符?

  10. 10

    包含 <experimental/filesystem> 后未声明“std::filesystem”

  11. 11

    C ++ VS错误:提供std :: experimental :: filesystem的<experimental / filesystem>标头已被Microsoft弃用,将被删除

  12. 12

    使用实验功能“交易”。使用“--experimental”标志启用实验功能

  13. 13

    在Keras顺序模型中使用tf.data.experimental.CsvDataset

  14. 14

    如何使用android gradle-experimental限制目标平台?

  15. 15

    设置了--experimental-modules的“无法在模块外部使用导入语句”

  16. 16

    在Keras顺序模型中使用tf.data.experimental.CsvDataset

  17. 17

    为什么在 Selenium 中使用 add_experimental_option?

  18. 18

    为什么要使用链接列表而不是数组或向量实现来实现堆栈或队列?

  19. 19

    如何使用std :: filesystem实现递归目录和文件列表?

  20. 20

    如何使用 std::list 作为暴露节点的列表的接口的实现?

  21. 21

    为什么使用数组而不是链接列表来实现IEnumerable(或IList)?

  22. 22

    我们可以使用继承来实现链接列表吗?

  23. 23

    为什么使用数组而不是链接列表来实现IEnumerable(或IList)?

  24. 24

    为什么clang和GCC不使用xchg来实现std :: swap?

  25. 25

    使用std :: tuple来实现operator <,=等有效且正确吗?

  26. 26

    使用std :: optional <A>作为A类的类成员

  27. 27

    是否使用空的std :: optional <string> UB?

  28. 28

    为什么我不能在g ++ 4.9.2中使用<experimental / filesystem>?

  29. 29

    Android Studio 2.0使用gradle-experimental插件中断了ndk的构建

热门标签

归档