在 C++ 中提供指针恒定视图的更好方法

2024-01-11

我有一个类必须返回一个constant一些指向软件上层的指针的视图。

在内部,指针必须是非常量,因为类需要在内部操作对象。

我没有看到任何选项可以在不复制所有指针的情况下向更高级别的客户端提供指针的常量视图。这看起来很浪费。如果我管理数百万个对象怎么办?

有没有更好的办法?

这是一些示例代码:

#include <vector>
#include <iostream>

class example {
public:
  
  example() {
    bytePtrs_.push_back(new char);
    *bytePtrs_[0] = '$';
  }

  // I want to do this, but compiler will not allow
  // error: could not convert ‘((example*)this)->example::bytePtrs_’ from ‘std::vector<char*>’ to ‘std::vector<const char*>’
  std::vector<const char*> getPtrs() { 
    return bytePtrs_; 
  }

  // Must make wasteful copy
  std::vector<const char*> getPtrs() { 
    std::vector<const char*> ret;
    for (auto &ptr : bytePtrs_)
      ret.push_back(ptr);
    return ret; 
  }

private:

  std::vector<char*> bytePtrs_;
};

int main() {

  example e;

  std::vector<const char*> bytePtrs = e.getPtrs();

  std::cout << bytePtrs[0] << std::endl; 

}

您可以使用以下方法执行此操作std::实验::propagate_const https://en.cppreference.com/w/cpp/experimental/propagate_const.

这将转发恒定性将指针指向所指向的对象。

#include <experimental/propagate_const>

class example {
public:

//  using vector = std::vector<char*>>;
    using vector = std::vector<std::experimental::propagate_const<char*>>;

    example() {
        bytePtrs.push_back(new char);
        *bytePtrs[0] = '$';
    }

    vector const& getPtrs() const {
        return bytePtrs;
    }

private:

    vector bytePtrs;
};

int main()
{
    example e;

    example::vector const& bytePtrs = e.getPtrs();

    // dereference this or add a null terminator
    std::cout << *bytePtrs[0] << std::endl; // fine and dandy

    *bytePtrs[0] = 'x'; // compile error
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中提供指针恒定视图的更好方法 的相关文章

随机推荐

  • 如何使用 GCC 生成一个最小的 BIOS hello world 引导扇区,以便在真实硬件上通过 USB 记忆棒工作?

    我已经成功地生成了一个可与 QEMU 2 0 0 Ubuntu 14 04 配合使用的最小引导扇区 code16 global start start cli mov msg si mov 0x0e ah loop lodsb or al
  • 如何扩展 woocommerce api 端点?

    我正在尝试扩展 woocommerce api 中的客户端点 以包含我在 Functions php 中创建的一些自定义字段 但我不明白该怎么做 我已经复制了class wc rest customers controller php从 w
  • GWT 应用程序上的 Selenium 测试 - 请求未发送到服务器

    我正在为 GWT 应用程序编写硒测试 它使用鼠标悬停 mousedown mouseup 方法来单击按钮 点击登录 我的应用程序的按钮 它调用包含 userid 的 div 和 密码输入字段 效果很好 然后输入一个用户 ID 并 密码 然后
  • R - 导入带有日期列的 xlsx 文件

    当我尝试读取 Excel 文件时 它总是与日期 时间混淆 library openxlsx download file http ec europa eu economy finance db indicators surveys docu
  • Flask-SQLAlchemy:通过一个关系进行多个过滤器

    我有两个模型 标签和照片 它们具有多对多关系 如下所示 tag identifier db Table tag identifier db Column photo id db Integer db ForeignKey photo id
  • 将消息从内容脚本发送到另一个脚本

    我正在开发一个 Google Chrome 扩展 我的目的是将消息从 script1 js 发送到 script2 js 这是我在manifest json中写的内容 matches https www google fr css styl
  • 响应式设计和图像尺寸

    问 就图像加载时间和性能而言 哪种技术最有效 场景1 是否通过使用媒体查询来加载不同尺寸的图像 如下 Smartphone media screen and max width 320px img page 1 img background
  • Android 版 facebook connect 返回空白登录屏幕?

    我正在尝试使用旧的 facebook 连接身份验证来验证我的 android 客户端 以获得开始使用 facebook 的网络服务所需的必要会话 ID 和其他凭据 我遇到的问题是 当我的 Android 应用程序启动并尝试加载 facebo
  • 防止 UIWebView 内出现烦人的 HTML5 地理位置警报

    每当脚本请求地理位置时 使用HTML5的地理定位 API UIWebView请求使用 iOS 定位服务的权限 这非常烦人 特别是当您加载静态时HTML文件时 它会不断询问每个文件的权限 即使用户已经为应用程序本身授予了此权限 有办法预防吗
  • Datatable:日期/时间排序插件未排序

    我有一个基本的 Spring Boot 应用程序 嵌入式 Tomcat Thymeleaf 模板引擎 我想订购数据表的 1 个日期列 在我的 POJO 中 public String getTimeFormatted DateTimeFor
  • ContentResolver.query() 方法抛出“无效令牌限制”错误

    内部版本号为 RQ1A 201205 003 或更高版本的 Pixel 设备上会出现以下错误 我想知道错误的原因以及如何处理 这是错误还是规格更改 code ContentResolver resolver getContentResolv
  • Visual Studio C++ Link1104无法打开文件MSVCURTD.lib

    我已经在 Visual Studio 2017 社区中打开了一个用 Visual Studio 2012 Express 用 C 编写 制作的项目 当我尝试编译时出现以下错误 LINK1104 无法打开文件 MSVCURTD lib 如果我
  • 重播 GIF 动画/单击时重新加载 GIF

    我有一个很大的 GIF 动画 我让它显示一个加载图标 直到 GIF 加载完毕 加载后就会显示 GIF 效果很好 但我想添加一个 重播 按钮来触发 GIF 重播 重新加载 加载和GIF的代码 HTML div class loading im
  • Linq to Entities 删除

    是否有内置方法可以使用主键通过 Linq to Entities 进行删除 目前的解决方法是创建一个名为DeleteTable的存储过程 表是表名 然后在 C LINQ To Entities 中我只需执行 context DeleteTa
  • 如何在 Appveyor 构建之前运行 VCUpgrade?

    我们分发了一组 Visual Studio 2010 项目文件 用户应该根据自己的口味进行升级 我们的 appveyor yml file http github com weidai11 cryptopp blob master appv
  • R Shiny with Leaflet - 单击后更改标记的颜色

    我正在开发一个闪亮的应用程序 它显示带有标记的传单地图 标记是可点击的 我收集被点击标记的 ID 但我还想更改单击标记的颜色 当标记为蓝色时 它应更改为红色标记 反之亦然 到目前为止 我已经有了跟踪单击的标记的代码 并且可以将 ID 存储在
  • 什么会导致 %5B0%5D 添加到 url

    我试图找出为什么删除过滤器的链接在我的网站上不起作用 似乎是因为链接已更改为包含 5B0 5D 和其他各种字母和数字 并添加了 据我所知 这是序列化函数导致的 还有其他什么可能导致这种情况 或者它绝对是序列化函数吗 它被称为百分比编码 ht
  • 在 netbeans 中运行 Web 应用程序

    我正在使用 netbeans 和 apache tomcat 来运行 Web 应用程序 我不断收到此错误 In place deployment at C WorkingDirectory Projects GreenWheelsProje
  • 从 iTunes Connect 中删除新的应用程序版本

    我在 iTunes Connect 中使用错误的版本号创建了应用程序的新版本 我想删除处于 准备上传 状态的新版本 我该怎么做呢 关于此还有其他问题 但他们没有提供任何答案 适用于已上传二进制文件的版本 或者已过时 我就此向 Apple 提
  • 在 C++ 中提供指针恒定视图的更好方法

    我有一个类必须返回一个constant一些指向软件上层的指针的视图 在内部 指针必须是非常量 因为类需要在内部操作对象 我没有看到任何选项可以在不复制所有指针的情况下向更高级别的客户端提供指针的常量视图 这看起来很浪费 如果我管理数百万个对