如何使我的对象可重新解释转换为数组,例如 std::complex?

2024-02-12

我刚刚学到这个是因为这个问题 https://stackoverflow.com/q/22919357,该标准规定std::complex(26.4 [复数]):

4 If z是类型的左值表达式cv std::complex<T> then:
- 表达方式reinterpret_cast<cv T(&)[2]>(z)应结构良好,
reinterpret_cast<cv T(&)[2]>(z)[0]应指定实部z, and
reinterpret_cast<cv T(&)[2]>(z)[1]应指定的虚部z.
此外,如果a是类型的表达式cv std::complex<T>*和表达a[i]对于整数表达式来说是明确定义的i, then:
reinterpret_cast<cv T*>(a)[2*i]应指定实部a[i], and
reinterpret_cast<cv T*>(a)[2*i + 1]应指定的虚部a[i].

这是我真正想利用的东西以符合标准的方式。有时我会使用 POD,例如数学向量,它们由单一数据类型组成。以下是两个示例类:

template <typename T, unsigned N>
struct Vector
{
    T v[N];
};

template <typename T>
struct Quaternion
{
    T r, i, j, k;
};

据我了解,实现允许在最后一个成员之后以及成员之间添加填充。意思就是sizeof(Quaterntion<float>)可能不等于sizeof(float[4]), and sizeof(Vector<double, 8>)可能不等于sizeof(double[8])。这意味着我通常必须添加一些static_assert到我的代码以确保我可以投射我的Vector<float, N>/Quaterntion<float> to a float*例如,不必担心填充(例如,用于传递到 C 库或 OpenGL 缓冲区)。

标准是否提供了某种方法,可以让我为我的小 POD 提供相同的保证,例如Vector and Quaternion, as std::complex做?我知道特定于实施的事情,例如__attribute__((packed))。我正在寻找一种非特定于实现的、符合标准的方法来执行此操作。由于该标准需要对此类事物的支持,以实现提供std::complex,我想知道是否还有一些标准方法可以将此保证应用于我自己的课程。


我认为你在问不可能的事情。

请记住,标准库实现者通常依赖于非标准扩展或实现定义的行为。事实上,在 VC++ 的复杂头文件中我们发现:

#pragma pack(push, _CRT_PACKING)

// implementation

#pragma pack(pop)

您可以为四元数做的是将所有成员放入一个数组中,因为结构地址可以被reinterpret_cast 为指向第一个成员的指针。但我想这违背了结构的目的(通过名称直接访问成员)。

这不完全是你所要求的,但提供了一个

operator const T*() const // can be written in a portable manner

对于你的结构,将允许你写

Quaternion<double> q = {};
const double * p = q;

以额外的运行时/内存开销为代价,具体取决于您如何实现转换运算符。

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

如何使我的对象可重新解释转换为数组,例如 std::complex? 的相关文章

  • 是否可以根据 QSlider 的位置来改变其手柄的颜色?

    我非常清楚如何通过样式表自定义 QSlider 但我想知道是否可以执行以下操作 我希望滑块的手柄从蓝色变为黄色 当设置在左侧时 它是蓝色的 设置在左侧时 它是蓝色的 当你将它向右移动时 它会出现从蓝色到黄色的渐变 如果可以通过样式表 如何实
  • C 中的隐秘结构定义

    我遇到了以下情况迷宫定义 https github com gduarte lkb blob master code stack maze h code typedef struct mazeNode int hasCheese int t
  • 以编程方式获取命名管道的系统名称

    我正在使用 WCF NetNamedPipeBinding 编写进程间通信 我的目标是让服务在 net pipe localhost service 上运行 所以我运行最简单的主机 host new ServiceHost contract
  • C++ - 错误 C3646:未知的覆盖说明符

    我修改了我的项目 编译后弹出一些奇怪的错误 ifndef BART RAY TRACER MESH H define BART RAY TRACER MESH H include
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • Swashbuckle 在 ASP.NET Core 中失败并出现 NotSupportedException 异常

    我跟着这个关于如何在我的 asp net core 2 2 项目中添加 swashbuckle 当我运行该项目时 我收到以下错误 处理请求时发生未处理的异常 NotSupportedException HTTP 方法 GET 和路径 id
  • 清理 STL 指针列表/向量

    您可以想出的最短的 C 块是多少来安全地清理std vector or std list指针 假设您必须对指针调用删除 list
  • esp8266互联网交换机问题

    我正在尝试制作一个门继电器开关系统 我可以通过端口转发从任何地方进行操作 我找到了一个非常有用的指南和代码 我的程序基于 https openhomeautomation net control a lamp remotely using
  • 如何使用 Unity 动态注册通用类?

    我有一个包含很多类 300 和 BaseClass 的程序集 我想用接口注册一个泛型类 统一后 您必须在 Name如果你想解析接口的对象数组 我想要一个对象数组主视图模型自动地 有没有办法通过反射来自动执行此操作 有什么建议么 示例 伪 p
  • SolrNet:尝试添加和提交时 SolrConnectionException (400) 错误请求

    我已经到了 SolrNet 执行 Add 方法的地步 但是当我尝试 Commit 时 我收到了错误 以下是我的 schema xml 模型 调用它的代码以及我得到的错误 更奇怪的是 尽管出现错误 但在我重新启动 Tomcat 后 该模型仍会
  • 如何用C语言创建字典?

    我正在用 C 语言编写一个微控制器 作为它的一部分 我想在 7 段显示器上显示某些字母 每个字母都有一个对应的数字 使 7 段显示屏显示该字母 它没有真正的模式 因为数字只是通过将显示字母所需的 7 段显示器上的位相加而成 因此如果我可以创
  • Visual Studio 扩展找不到所需的程序集

    我为 Visual Studio 2013 编写了一个扩展 因为该死的组合框错误 https stackoverflow com questions 7800032 cancel combobox selection in wpf with
  • 如果未先将 lambda 表达式强制转换为委托或表达式树类型,则无法将其用作动态分派操作的参数

    我正在使用 NET4 5 和 VS2013 我有这个查询dynamic来自数据库的结果 dynamic topAgents this dataContext Sql select t create user id as User sum t
  • 如何收集和存储tellp()、tellg()返回类型?

    我正在编写一个在文件中维护 linked list 的程序 因此 我通过使用tellp tellg 遍历文件并将其添加到特定的长整数 可以视为偏移量 以到达新位置 一个简单的例子是 long next offset sizeof long
  • Windows 中的蓝牙 AVRCP 命令会触发哪些事件

    可以这么说 只是在做一些高级侦察 对于我的潘多拉客户 Elpis http elpis adamhaile net 我支持全局媒体键 键盘上的 MediaPlayPause MediaNext 等 并且我希望能够支持AVRCP http e
  • 如何将 .ashx 处理程序与 asp:Image 对象一起使用?

    我有一个 ashx 处理程序 using System using System Web public class Thumbnail IHttpHandler public void ProcessRequest HttpContext
  • Linq 表达式树 Any() 问题

    您好 我在使用 Any 扩展方法的表达式树时遇到问题 这是我的代码 IQueryable
  • 为什么删除void*是UB而不是编译错误?

    为什么要通过删除对象void 是未定义的行为 而不是编译错误 void foo void p delete p 这段代码编译并生成代码 尽管有关于 gcc 和 clang 的警告 令人惊讶的是 ICC 没有给出警告 2 5 warning
  • printf 右对齐括号内的数字

    我正在编写一个程序 显示数组中的所有信息 它必须以括号中的数组索引开头 例如 2 并且它们必须彼此正确对齐 如果只是数字 我知道你可以这样做 printf 10d index 但是用括号括起来会得到以下输出 1 2 10 11 当我真正希望
  • C++ 中带逗号的表达式的执行顺序 [重复]

    这个问题在这里已经有答案了 我的理解是这个词j i将在之前执行 i在声明中 j i i C 标准是否保证j i将在之前执行 i在循环 for auto i std next begin j begin i end j i i 逗号运算符引入

随机推荐

  • 防止 CMake 查看库和包含的路径

    考虑下面的简单 CMake 脚本 试图找到一个虚构的theheader hC 头文件 据我所知 这是在目录中查找库的包含目录的典型方法FindXXX cmake模块 cmake minimum required VERSION 2 6 pr
  • 在meteor中,pub/sub可以用于任意内存对象(不是mongo集合)

    我想在我的流星应用程序中建立双向 双向 通信 但我需要在不使用 mongo 集合的情况下做到这一点 那么 pub sub 可以用于任意内存对象吗 有没有更好 更快或者更低级的方法 性能是我最关心的问题 Thanks 是的 pub sub 可
  • 在 PHP 中为 MySQL 表的每一行添加一个删除按钮

    我试图在每一行添加一个删除按钮 以便按下按钮时可以删除记录 我是 PHP MySQL 和 Stack Overflow 的新手 下面是我的表 它从我的 MySQL 数据库中提取信息并且有效 table class table tr th S
  • 重新定义(#define)保留的C++关键字

    是否可以使用 define 重新定义 C 关键字 ifdef int undef int define int 2 endif int main Do something with int 在这种情况下我看不到输出 但我想了解内部发生的情况
  • 如何使用 Jquery Knob 显示单位

    我正在使用 Jquery 旋钮 http anthonyterrien com knob http anthonyterrien com knob 并且它工作得很好 但我不想在中间显示无量纲数字 我想用它显示单位 ei 或 F 等 我该怎么
  • 构建 conda 配方时如何修复 conda“ResolvePackageNotFound”

    我从 github 下载了一个 conda 包 进行了一些修改 并想在 conda 环境中构建这个本地包并测试我的更改 问题是配方的构建失败 因为 conda 有一个conda exceptions ResolvePackageNotFou
  • 可以显示 Python 输入编辑的默认值吗?

    python 是否可以接受这样的输入 Folder name Download 但用户无需输入 下载 它就已作为初始值存在 如果用户想要将其编辑为 下载 他所要做的就是添加一个 s 并按 Enter 键 使用普通输入命令 folder in
  • 如何分离 Firebase 数据库中的测试数据和生产数据?

    每个 Firebase 项目仅包含一棵数据 JSON 树 最佳实践规定测试应该在与生产数据不同的数据库上运行 实现这一目标的最简单方法是什么 我考虑过的一些事情 在同一项目中使用多个子树进行测试和生产 这看起来很混乱 并且测试和生产数据很难
  • 使用 Java 和 jmf 从网络摄像头捕获实时视频

    为了使用 java 和 jmf 从网络捕获实时视频 我编写了以下代码 我还插入了 USB 网络摄像头 但它给出了java util NoSuchElementException有人请帮助我 import java util Vector i
  • Zend Framework 中使用的设计模式 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ActionBarActivity 在电话上捕获错误

    建议我使用 ActionBar Activity 这是之前的代码 import android support v7 app ActionBar import android support v7 app ActionBarActivity
  • C# 在没有 Excel 的情况下将 .xls 转换为 .csv [重复]

    这个问题在这里已经有答案了 需要在 C ASP net Web 应用程序中不使用 Excel 的情况下将 xls 或 xlsx 转换为 csv 该应用程序当前正在使用 NPOI dll 来实现某些功能 但我在 codeplex wiki 上
  • Chartjs - 在整数 x 轴值上绘制垂直线

    在下面的示例中 chartjs 注释使用字符串值 MAR 但不是整数值 如何在某个整数 x 轴值上绘制垂直线 var chartData labels JAN FEB MAR datasets data 12 3 2 window onlo
  • 致命错误:不在对象上下文解释中使用 $this?

    我遇到了这个奇怪的错误 这是我以前从未遇到过的 致命错误 不在对象上下文中使用 this Chat php 类
  • 避免 Spring AOP 中的就地切入点表达式

    我正在使用 Spring AOP 我给出的切入点如下 Pointcut execution com demo Serviceable public void serviceMethodCalls 是否可以避免 Spring AOP 中的就地
  • 使用正斜杠作为 ID 属性

    刚刚发现您可以使用 任何 unicode 字符作为 ID 属性 这为我打开了一个全新的世界 但我试图将 ID 属性设置为 name 并且它不想工作 这是我所得到的 http jsfiddle net z2xkm9pr http jsfidd
  • 如何获取Python模块中函数的行号(带/不带装饰器)?

    我想获取源代码中python函数的行号 我在运行时拥有的是模块 类 方法对象 看过检查 inspect getsourcelines object 这也给出了结果中的行号 我看到对于带有装饰器的方法 第 1 行 从上面的检查函数返回指向实际
  • 无法让 onSharedPreferenceChanged() 工作

    当用户从我的首选项活动中的列表首选项中选择特定项目时 我想显示一个对话框 但是 我无法让 onSharedPreferenceChanged 工作 我在方法的开头放了一个Toast 但它没有显示 所以方法根本没有运行完 这是为什么 这是我的
  • 更改微调器中所选项目的文本颜色

    如何更改微调器中所选项目的字体颜色 我可以更改所选项目的背景颜色 下拉项目的颜色等 但不能更改所选项目的文本颜色 我该怎么做 我的代码是 这是我正在使用的微调器
  • 如何使我的对象可重新解释转换为数组,例如 std::complex?

    我刚刚学到这个是因为这个问题 https stackoverflow com q 22919357 该标准规定std complex 26 4 复数 4 If z是类型的左值表达式cv std complex