什么是 void `std::allocator`?即:`std::allocator`

2023-11-25

自动生成ROS(机器人操作系统)message C++ 头文件包含如下类型定义:

typedef  ::std_msgs::Header_<std::allocator<void> > Header;

什么是std::allocator<void>意思是这里?为什么是模板类型void?这是什么意思?什么时候使用?

这是文档std::allocator<>:

  1. https://www.cplusplus.com/reference/memory/allocator/
  2. https://en.cppreference.com/w/cpp/memory/allocator

这是要查看的自动生成文件的示例:http://docs.ros.org/en/electric/api/std_msgs/html/msg__gen_2cpp_2include_2std__msgs_2Header_8h_source.html.

上面的第一行是第 116 行。

这是自动生成的 ROS 消息的开始Header_ class:

template <class ContainerAllocator>
struct Header_ {

这是自动生成的更多上下文Header.h,与各种typedefs 在底部:

template <class ContainerAllocator>
struct Header_ {
  typedef Header_<ContainerAllocator> Type;

  Header_()
  : seq(0)
  , stamp()
  , frame_id()
  {
  }

  Header_(const ContainerAllocator& _alloc)
  : seq(0)
  , stamp()
  , frame_id(_alloc)
  {
  }

  typedef uint32_t _seq_type;
  uint32_t seq;

  typedef ros::Time _stamp_type;
  ros::Time stamp;

  typedef std::basic_string<char, std::char_traits<char>, typename ContainerAllocator::template rebind<char>::other >  _frame_id_type;
  std::basic_string<char, std::char_traits<char>, typename ContainerAllocator::template rebind<char>::other >  frame_id;


private:
  static const char* __s_getDataType_() { return "std_msgs/Header"; }
public:
  ROS_DEPRECATED static const std::string __s_getDataType() { return __s_getDataType_(); }

  ROS_DEPRECATED const std::string __getDataType() const { return __s_getDataType_(); }

private:
  static const char* __s_getMD5Sum_() { return "2176decaecbce78abc3b96ef049fabed"; }
public:
  ROS_DEPRECATED static const std::string __s_getMD5Sum() { return __s_getMD5Sum_(); }

  ROS_DEPRECATED const std::string __getMD5Sum() const { return __s_getMD5Sum_(); }

private:
  static const char* __s_getMessageDefinition_() { return "# Standard metadata for higher-level stamped data types.\n\
# This is generally used to communicate timestamped data \n\
# in a particular coordinate frame.\n\
# \n\
# sequence ID: consecutively increasing ID \n\
uint32 seq\n\
#Two-integer timestamp that is expressed as:\n\
# * stamp.secs: seconds (stamp_secs) since epoch\n\
# * stamp.nsecs: nanoseconds since stamp_secs\n\
# time-handling sugar is provided by the client library\n\
time stamp\n\
#Frame this data is associated with\n\
# 0: no frame\n\
# 1: global frame\n\
string frame_id\n\
\n\
"; }
public:
  ROS_DEPRECATED static const std::string __s_getMessageDefinition() { return __s_getMessageDefinition_(); }

  ROS_DEPRECATED const std::string __getMessageDefinition() const { return __s_getMessageDefinition_(); }

  ROS_DEPRECATED virtual uint8_t *serialize(uint8_t *write_ptr, uint32_t seq) const
  {
    ros::serialization::OStream stream(write_ptr, 1000000000);
    ros::serialization::serialize(stream, seq);
    ros::serialization::serialize(stream, stamp);
    ros::serialization::serialize(stream, frame_id);
    return stream.getData();
  }

  ROS_DEPRECATED virtual uint8_t *deserialize(uint8_t *read_ptr)
  {
    ros::serialization::IStream stream(read_ptr, 1000000000);
    ros::serialization::deserialize(stream, seq);
    ros::serialization::deserialize(stream, stamp);
    ros::serialization::deserialize(stream, frame_id);
    return stream.getData();
  }

  ROS_DEPRECATED virtual uint32_t serializationLength() const
  {
    uint32_t size = 0;
    size += ros::serialization::serializationLength(seq);
    size += ros::serialization::serializationLength(stamp);
    size += ros::serialization::serializationLength(frame_id);
    return size;
  }

  typedef boost::shared_ptr< ::std_msgs::Header_<ContainerAllocator> > Ptr;
  typedef boost::shared_ptr< ::std_msgs::Header_<ContainerAllocator>  const> ConstPtr;
  boost::shared_ptr<std::map<std::string, std::string> > __connection_header;
}; // struct Header
typedef  ::std_msgs::Header_<std::allocator<void> > Header;

typedef boost::shared_ptr< ::std_msgs::Header> HeaderPtr;
typedef boost::shared_ptr< ::std_msgs::Header const> HeaderConstPtr;

Related

我相信这些不是重复的:

  1. 什么是分配器- 不是重复的,因为我问的是具体情况T is void,不是 a 的一般情况std::allocator<>.
  2. 弃用 std::allocator- 不是重复的,因为我不知道为什么它在 C++20 中被弃用或更改,我问的是std::allocator<void>case 是一般情况,它的作用以及何时/为何使用它。
  3. https://answers.ros.org/question/212857/what-is-constptr/

std::allocator<void>是一种分配器类型,专门用于通过以下方式声明特定对象的其他分配器类型rebind模板。

在你的情况下Headertypedef 基本上只是说默认分配器Header_ is std::allocator. Header_用它来创建std::allocator<char> for frame_id。我想从风格上来说也可能是std::allocator<char>排在第一位(在 typedef 处)因为Header_此时将其用于std::string仅仅但是Header_看起来不像普通容器char like std::string or std::vector如此明确的通用类型std::allocator<void>更有意义。在这种情况下更重要的可能是在脚本或脚本中使用这样的分配器更容易template自动生成代码。

欲了解更多信息,请检查:

  • 15.3.1 使用标准分配器接口注释rebind模板
  • 为什么 allocator 被弃用?Andrey Semashev 在 Google 网上论坛讨论中发表的帖子
  • 分配器感知容器cppreference.com 上的要求
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是 void `std::allocator`?即:`std::allocator` 的相关文章

  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock

随机推荐

  • 带有 proguard 的 Ksoap2

    我有一个使用 ksoap2 库的应用程序 一切正常 但是从 Eclipse 导出应用程序时 它显示了这个 Proguard returned with error code 1 See console Note there were 4 d
  • 保存图形后,图形标签和刻度后面的黑色背景,但不在交互视图中

    我有一个奇怪的问题 如果我保存一个图形 它的标签和刻度线将具有黑色背景 请参阅此示例 plt savefig asdsadsad png 我什至没有在此处包含任何代码 因为这种情况发生在最简单的绘图上 即使我之前使用另一台从未出现过此问题的
  • SQLAlchemy 列到行转换,反之亦然——这可能吗?

    我正在寻找一种仅 SQLAlchemy 的解决方案 用于将从表单提交收到的字典转换为数据库中的一系列行 每个行对应提交的每个字段 这是为了处理不同应用程序之间差异很大的首选项和设置 但是 它很可能适用于创建类似数据透视表的功能 我在 ETL
  • 停止在 PHP 中使用“global”

    我有一个config php包含在每个页面中 在配置中我创建了一个看起来像这样的数组 config array config site name Site Name config base path home docs public htm
  • 角度动态行跨度

    人数及其手机号码是动态的 我需要在表格中显示这一点 数据可以包含任意数量的用户名和手机号码 dataList pname abc numbers mobile1 123 mobile2 234 pname mno numbers mobil
  • Play/Java 应用程序中的依赖项 javaWs、javaJpa 等来自哪里?

    我正在使用 Java 在 Play Framework 中启动一个新项目 我检查了build sbt文件并且无法理解依赖项名称的来源 libraryDependencies Seq javaJdbc cache javaWs javaJpa
  • SimpleDateFormat:无法解析的日期异常

    在查看了几篇现有的帖子后 我仍然无法让我的 SimpleDateFormat 解析器正常工作 这是代码 SimpleDateFormat df new SimpleDateFormat EEE dd MMM yyyy HH mm ss Z
  • 如何在ARCore中显示PNG图像?

    我想在 Arcore 中显示 2d png 图像 我不想使用 obj smf imgdb 文件和 3D 图像 我已经引用了很多链接 但没有一个链接显示如何使用 Arcore 仅显示 2d png 图像 https github com go
  • Java:在小程序中将pdf文件从URL读取到字节数组/ByteBuffer中

    我试图找出为什么这个特定的代码片段对我不起作用 我有一个小程序 它应该读取 pdf 并使用 pdf 渲染器库显示它 但由于某种原因 当我读取服务器上的 pdf 文件时 它们最终被损坏 我已经通过再次写回文件来测试它 我尝试在 IE 和 Fi
  • PHP将csv列读入数组

    我有一个 php 函数可以让我将 csv 列 COLUMN NOT LINE 读取到数组或字符串中 先感谢您 csv array map str getcsv file data csv header array shift csv Sep
  • 使用 socket.gethostname 时,socket.getfqdn() 和 socket.gethostname() 给出不同的 IP 地址

    我正在运行一个虚拟机 它提供以下值以及运行代码的时间 通过在网站上执行一些操作 socket getfqdn x vps 01 abc it socket gethostname x vps 01 socket gethostbyname
  • 如果没有断言,pytest 会失败吗?

    今天我的测试失败了 但很高兴成功了 因为我忘记了最后一行相当重要的一行 assert actual expected 我希望机器将来能够发现这个错误 有没有办法让 pytest 检测测试函数是否未断言任何内容 并将其视为测试失败 当然 这需
  • firestore 规则中是否有循环?

    我想知道是否有更简单的方法来实现这个规则 刚刚开始尝试 firestore match emails emailId allow write if request resource data attachments size 0 reque
  • 在C#背后的代码中实现javascript确认框

    我想从代码后面实现javascript确认框 我的要求是在一种方法中我需要提出一个确认框 根据结果我需要实现差异功能 例如 如果确认框确定 则添加税费 如果取消则不加税 我正在尝试这样的事情 但它对我没有帮助 ScriptManager R
  • Netcat:使用 nc -l port_number 而不是 nc -l -p port_number

    这个问题是在这个问题之后 在 openSUSE 中工作的套接字在 Debian 中不起作用 在 Debian 系统上使用套接字时 我必须使用 nc l p port number 来模拟我想要与之通信的服务器 如果我使用 nc l port
  • 使用 Oracle 的块过程 PL/SQL

    我有一个程序 我希望只有一个用户可以同时执行该程序 这就是我的想法 考虑通过 dbms lock 使用命名锁 http download oracle com docs cd B28359 01 appdev 111 b28419 d lo
  • RESTful 应用程序中的乐观锁定

    在工作中 我们正在开发一个 RESTful 应用程序 其中数据层将由 Hibernate 处理 但我们不确定如何处理实体的更新 我们计划执行以下操作 1 客户端通过id请求实体2 Hibernate加载实体 请求的字段 始终带有版本 被复制
  • 如何使用 asyncio 连接阻塞和非阻塞代码

    我正在尝试在事件循环之外使用协程函数 在本例中 我想调用 Django 中的一个函数 该函数也可以在事件循环内使用 如果不让调用函数成为协程 似乎没有办法做到这一点 我意识到 Django 被构建为阻塞的 因此与 asyncio 不兼容 尽
  • Pandas 在第 0 个位置插入空行

    假设有以下数据框 A B 1 2 3 4 5 4 5 6 7 8 我想检查一下是否df 0 0 is nan然后在第 0 个位置插入 pd series np nan 所以在上面的情况下将会是 A B 1 2 3 4 5 4 5 6 7 8
  • 什么是 void `std::allocator`?即:`std::allocator`

    自动生成ROS 机器人操作系统 message C 头文件包含如下类型定义 typedef std msgs Header