如何制作深度常量指针

2023-12-03

假设我想用 C++ 表示二叉树。通常,我想要一个Node像这样的结构:

struct Node {
  Node* left
  Node* right;
};

(这里我使用结构体和原始指针只是为了简单起见。我知道我应该使用智能指针进行内存管理。)

这种表述有一个问题:我永远无法拥有深度-const树。 (如果可以的话请纠正我。)我可以标记一个Nodeconst,但它的孩子被硬编码为非const in the Node struct.

(我可能会使用一些template破解制作left and right可选地const,但这使得 constNode和非const Node不相容。)

很快我发现,如果我神奇地拥有一些深刻的——const指针(比如deep_const_pointer,这使得constness 及物性),我可以使用该指针Node以便有一个const节点自动意味着有一个const子树。

我试图写一篇有深度的文章const指针类,这就是我最终得到的结果:

template <typename T>
class deep_const_pointer {
public:
  explicit deep_const_pointer(const T* p_)
    : p{const_cast<T*>(p_)} {}

  const T& operator*() const { return *p; }
  T& operator*() { return *p; }

  const T* operator->() const { return p; }
  T* operator->() { return p; }

  // etc.

private:
  T* p;
};

这里我抛出了const在构造函数中,并可选择根据const这个类似指针的对象的性质。但是,此实现允许执行以下操作:

const int i = 42;
deep_const_pointer<int> p{&i};
*p = 0; // Oops!

所以这取决于用户正确标记指针是否为const or not.

我该如何建立一个深层次的const指针类?理想情况下,我想要const检查发生在编译时,并且该指针类占用与原始指针一样多的内存。 (这排除了保存的解决方案const对一个bool成员变量并检查每次访问。)

EDIT: 我检查了std::experimental::propagate_const,从我的角度来看,它确实不是一个“深层常量”指针。我所说的深层常量指针是什么意思P is:

  1. 持续的P是指向 const 的指针;
  2. Mutable P是指向可变的指针;
  3. 对非常量的 const 引用P被视为 constP;
  4. 由于指向 const 的指针具有值语义,因此 constP应该是可以简单复制的。

propagate_const不符合要求,因为:

  1. 它从不接受指向 const 的指针;
  2. 它是不可复制的(显式删除复制构造函数);

从我收到的评论和回答来看,我猜是这样的P无法在 C++ 中实现。


写一个及物动词-const智能指针已解决问题,只需查找std::experimental::propagate_const<>。找到合适的实现应该不会太难。

在您自己的尝试中,您从原始指针构造错误。你不应该添加const到足尖类型,也不要用石膏将其剥离。
Fixed:

explicit deep_const_pointer(T* p_)
    : p{p_} {}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何制作深度常量指针 的相关文章

  • 从 C 中的 char* 获取单个字符

    有没有办法在 C 中逐字符遍历或从 char 中提取单个字符 考虑以下代码 现在获得单个角色的最佳方式是什么 建议我一种不使用任何字符串函数的方法 char a STRING 其他方式 char i for i a i i i points
  • c# - 显示小数点到小数点后 6 位 [重复]

    这个问题在这里已经有答案了 可能的重复 具有 N 个小数位的 Double ToString https stackoverflow com questions 3059759 double tostring with n number o
  • dup2() 和 exec()

    include
  • 动态选择和更新 LINQ 结果集中的列值

    我有一个场景 其中存在 LINQ 结果集 我使用了以下查询 var stockDetails from d in db BloodBanks where d bbUserName Session username ToString sele
  • std::tr1::function 和 std::tr1::bind

    我在使用时遇到问题veryC 类中的复杂 C 函数 重写 C 函数是not一个选项 C函数 typedef void integrand unsigned ndim const double x void fdata unsigned fd
  • EF Core 一对多关系列表返回 null

    我正在尝试学习如何在 EF Core 中正确利用 DbContext 我有一个团队课程 public class Team public int ID get set public string Name get set public bo
  • 如何在Azure功能中添加razor视图文件?

    我正在创建一个应用程序 它是 azure 函数项目 我想在该项目中使用 Razor 视图 我应该在 azure 函数中使用任何模板引擎吗 得益于一些方面的进步剃刀之光项目 https github com toddams RazorLigh
  • Identity Server 4:添加访问令牌的声明

    我正在使用 Identity Server 4 和隐式流 并且想要向访问令牌添加一些声明 新的声明或属性是 tenantId 和 langId 我已将 langId 添加为我的范围之一 如下所示 然后通过身份服务器请求 但我也获得了tena
  • 为什么这个单独的定义会导致错误?

    挑战 我有这段代码无法编译 你能找出问题所在吗 有一次让我很头疼 header namespace values extern std string address extern int port cpp file std string v
  • 除空字符串外的任何内容的正则表达式

    是否可以使用正则表达式来检测任何不是 空字符串 的内容 如下所示 string s1 string s2 string s3 string s4 etc 我知道我可以使用修剪等 但我想使用正则表达式 s 将匹配任何包含至少一个非空格字符的字
  • 将授权标头添加到 Web 参考

    我正在尝试向客户端的网络服务发出请求 我不知道客户端的底层平台 我使用 添加 Web 引用 在 Visual Studio 2010 中使用了客户端的 WSDL 并生成了我的代理类 称为 ContactService 我现在需要将如下所示的
  • 为什么我无法调试动态加载的程序集?

    我正在开发一个 Web API 项目 该项目使用内部模拟框架 允许拦截和修改来自控制器的响应 它使用 MEF 加载包含某些先决条件匹配时执行的代码的程序集 我知道这是正常工作的 因为我可以在响应中看到模拟已被执行 但由于某种原因我无法调试动
  • 我可以对(非成员)函数使用部分模板特化吗?

    我试图在 非成员 函数上使用部分模板专业化 但我在语法上遇到了问题 我在 StackOverflow 中搜索了其他部分模板专业化问题 但这些问题涉及类或成员函数模板的部分专业化 作为起点 我有 struct RGBA RGBA uint8
  • 类型别名和不完整类型

    我可能已经超出了解决这个本应简单的问题的范围 我在这里开始这个问题 在编译时获取基类的类型 https stackoverflow com questions 17735852 getting type of a base class at
  • 为什么必须通过 this 指针访问模板基类成员?

    如果下面的类不是模板 我可以简单地拥有x in the derived班级 但是 通过下面的代码 我have to use this gt x Why template
  • 使用 _Alignas 进行结构成员对齐

    我想知道以下问题 是新的吗 Alignas结盟 C11 中的说明符适用于结构成员吗 我一直假设这么多 但彻底阅读了 N1570 公开草案似乎表明对齐说明符不能 出现在一个说明符限定符列表 这就是我所期望的 如果得到支持的话 我已经读过几遍语
  • C# 3.0 中自动属性和公共字段的区别

    我无法理解为什么 C 3 0 中存在自动实现的属性语言功能 当你说的时候有什么区别 public string FirstName than public string FirstName get set 因为它们在生成的 IL 代码 和机
  • 用于 nmap 输出的 C++ xml 解析器

    我是 nmap 的新手 我在 nmap 教程中看到 https nmap org book man output html https nmap org book man output html oX 选项可用于获取 xml 格式的 nma
  • 是否可以编写一个在另一个 Windows 应用程序中选择文本时收到通知的 Windows 应用程序?

    我很好奇是否可以编写一个程序来监视我的文本选择 一种可能的用途是编写一个与编辑器 IDE 无关的代码格式化程序 应用程序 服务 P 启动并以某种方式挂接到窗口中 以便在任何窗口中选择文本时收到通知 启动其他一些应用程序 A 用户选择 A 中
  • 如何使用 Ioc Unity 注入依赖属性

    我有以下课程 public interface IServiceA string MethodA1 public interface IServiceB string MethodB1 public class ServiceA IServ

随机推荐

  • 如何在 Spidermonkey 中创建、处理和销毁 JS::Heap 对象?

    Using 蜘蛛猴 24 38 45 蜘蛛猴文档说 堆上的 GC 事物指针必须包装在 JS Heap 中 唯一的例外是 如果使用 JS AddRoot 函数或 JS PersistentRooted 类将它们添加为根 但是不要这样做 除非这
  • 未检查 TypeScript 内联类型

    有两种 至少 方法可以在 TS 中声明变量的类型 但它们似乎以不同的方式工作 这是一个错误还是一个功能 对我来说看起来像一个错误 type T1 Partial lt a string gt const wrong1 T1 a1 a thi
  • 在 Xcode 8.2 中编译大型数组文字

    使用 Swift 存储大型多维数组的最佳方法是什么 我有一个 4D 整数数组 它似乎在 Xcode 8 2 中减慢了编译速度 因为它大约有 200 组 9 个整数 总共 1800 个 第一个数组由 12 个数组组成 每个数组有 8 个数组
  • 如何按日期对数据框进行排序

    我需要在 R 中按日期对数据框进行排序 日期均采用 dd mm yyyy 的形式 日期位于第三列 列标题是 V3 我已经了解了如何按列对数据框进行排序 并且了解了如何将字符串转换为日期值 我无法将两者结合起来以便按日期对数据框进行排序 假设
  • 在 Python 3 中从同一包内和包外导入模块

    好吧 场景很简单 我有这个文件结构 interface py pkg init py mod1 py mod2 py 现在 这些是我的条件 mod2需要导入mod1 interface py 和 mod2 都需要作为主脚本独立运行 如果您愿
  • 如何捕获 PHP 类型提示中的“可捕获的致命错误”?

    我正在尝试在我的一堂课上实现 PHP5 的类型提示 class ClassA public function method a ClassB b class ClassB class ClassWrong 正确用法 a new ClassA
  • 使用 VS2010 Async CTP 的主要风险与好处是什么?

    我想用Visual Studio 异步 CTP 版本 3 在 Windows XP SP3 上的 VS2010 SP1 中进行开发和测试主要是因为我的客户 以及我 在 Windows XP SP3 上 Ghere在MSDN论坛上有相关讨论
  • 在 Excel 中使用 VBA 将文本文件通过 FTP 传输到服务器

    我有一个 Excel 工作表 用户在其中输入某些数据 我想将其存储在文本文件中并使用 FTP 上传到服务器 一个站点建议添加对 Microsoft Internet Transfer Control 的引用 然后定义一个 Inet 对象来执
  • 即时应用程序在 adview.loadAd 上崩溃,SecurityException:无法找到提供程序 com.google.android.gsf.gservices

    我使用的是 Play Services ads 10 2 6 它与已安装的应用程序配合得很好 这是堆栈跟踪 java lang SecurityException Failed to find provider com google and
  • 编写 Rx“RetryAfter”扩展方法

    在书里介绍ToRx作者建议为 I O 编写一个 智能 重试 在一段时间后重试 I O 请求 例如网络请求 这是确切的段落 添加到您自己的库中的一个有用的扩展方法可能是 返回 关闭并重试 方法 我合作过的团队发现了这样一个方法 该功能在执行
  • 如何确定 Python 类的每个属性和方法的定义位置?

    给定 Python 中某个类的实例 能够确定源代码的哪一行将很有用defined每个方法和属性 例如实现1 例如 给定一个模块 ab py class A object z 1 q 2 def y self pass def x self
  • 将文件夹的文件夹中的文件重命名为其父文件夹?

    我有一批文件夹 其名称基于日期 每个文件夹都有一个文件夹 其中的文件名全部相同 有没有办法重命名文件 使它们根据它们所在的目录结构 显示的是基于日期的父文件夹 第一个文件夹 而变得唯一 user date 1 2 2019 ABC 0001
  • 在 MS Access 2010 中使用正则表达式替换列

    ms access 2010中有一个名为sample的表 仅包含一列body 类型 文本
  • 完美转发与 const 引用

    我有一个简单的问题我不明白 int solution int a int b int main int a b std cin gt gt a gt gt b std cout lt lt solution std forward
  • Git:删除超过 1 年的提交

    我有一个 Web 应用程序 使用 git 不仅可以管理源代码控制 还可以部署更改 我将更改推送到 github 上的远程存储库 并且我的网络服务器有一个 webhook 然后根据这些更改进行更新 现在我注意到我的本地 git 存储库大约有
  • 我使用字典是否错误,看起来太慢了

    我使用了 VS 分析器并注意到程序大约 40 的时间花费在下面的行中 我在用着title1 and color1因为 Visual Studio 或 Resharper 建议这样做 下面的代码是否存在性能问题 Dictionary
  • codeigniter 调整图像大小并创建缩略图

    您好 根据 ci 文档 您可以使用 image lib 调整图像大小 并且有一些选项建议我们可以从该图像创建其他缩略图 create thumb FALSE TRUE FALSE boolean Tells the image proces
  • 链接时可以混合静态库和共享库吗?

    我有一个 C 项目 它生成十个可执行文件 我希望将所有这些文件静态链接 我面临的问题是这些可执行文件之一使用第三方库 其中只有共享对象版本可用 如果我通过了 static标记为 gcc ld 会错误说它找不到有问题的库 我认为它正在寻找 a
  • Spring MVC:如何重定向到有错误的页面?

    我试图让我的控制器重定向到带有自定义错误消息的页面 RequestMapping method RequestMethod POST public String processSubmit Valid Voter voter Binding
  • 如何制作深度常量指针

    假设我想用 C 表示二叉树 通常 我想要一个Node像这样的结构 struct Node Node left Node right 这里我使用结构体和原始指针只是为了简单起见 我知道我应该使用智能指针进行内存管理 这种表述有一个问题 我永远