C++ 11中不可变的"功能"数据结构

use*_*710 3 c++ multithreading immutability data-structures c++11

我试图写下一些我对多线程/并发场景感兴趣的数据结构的实现.

很多功能性的语言,几乎所有我知道的,设计自己的数据结构,以这样的方式,他们是不变的,所以这意味着如果你要添加value到一个实例t1T,你真正得到的新实例T那包t1 + value.

 container t;
 container s = t; //t and s refer to the same container.
 t.add(value); //this makes a copy of t, and t is the copy
Run Code Online (Sandbox Code Playgroud)

我在C++ 11中找不到合适的关键字; 标准库中有关键字,语义和函数,它们明确地面向功能方法,特别是我发现:

  • mutable它不是运行时,它更可能是编译器的提示,但是这个关键字并不能真正帮助您设计新的数据结构或以不可变的方式使用数据结构
  • swap 对临时工作不起作用,这对我来说是一个很大的缺点

我也不知道其他关键字/功能对这种设计有多大帮助,swap其中一个真的很接近好东西,所以我至少可以开始写东西,但显然它只限于lvalues.

所以我问:用C++ 11 设计不可变的数据结构是否可行?

pas*_*sti 6

您只需使用私有成员变量声明一个类,并且您不提供任何方法来更改这些私有成员的值.而已.只从类的构造函数初始化成员.没有人能够以这种方式改变班级的数据.用于创建不可变对象的C++工具是成员的私有可见性.

mutable:这是C++中最大的攻击之一.我一生中最多看到两个地方,它的使用是合理的,这个关键字几乎与你所寻找的相反.如果要在C++中搜索关键字以帮助您在编译时标记数据成员,那么您正在搜索const关键字.如果将类成员标记为const,则只能从构造函数的INITIALIZER LIST初始化它,并且在实例的整个生命周期内都不能再修改它们.这不是C++ 11,它是纯C++.没有神奇的语言功能来提供不变性,你只能通过巧妙的编程来实现.

  • mutable很适合懒惰的评估 (3认同)
  • 偶尔使用`mutable`来延迟加载一个成员. (2认同)
  • @ user2485710,问一个没有代码的模糊问题,得到一个没有代码的模糊答案.如果您需要更具体的建议,您需要在问题中更具体. (2认同)
  • 我认为你有一个创建不可变类的确切方法,你不需要神奇的C++ 11关键字.@leemes我可以回想起两个可变的可变示例:针对const/immutable对象的侵入式引用计数,也许还有一些调试计数器/变量......在大多数情况下,对象可能不是真正的const或者它的mutable/non-const partn'是一个不可变成员,而是另一个引用对象. (2认同)
  • @ user2485710:除了`const` (2认同)