如何同时更新结构体的多个字段?

2023-11-22

假设我有一个结构

struct Vector3 {
    float x;
    float y;
    float z;
};

注意sizeof(Vector3)必须保持不变。

编辑:我对没有设置器的解决方案感兴趣。

我们不要创建该结构的实例Vector3 pos。我怎样才能实现我的结构,这样我就可以有这样的东西pos.xy = 10 // updates x and y or pos.yz = 20 // updates y and z or pos.xz = 30 // updates x and z?


这是一个具有所需语法的解决方案,并且不会增加类的大小。它在技术上是正确的,但相当复杂:

union Vector3 {
    struct {
        float x, y, z;
        auto& operator=(float f) { x = f; return *this; }
        operator       float&() &        { return  x; }
        operator const float&() const &  { return  x; }
        operator       float () &&       { return  x; }
        float* operator&()               { return &x; }
    } x;
    
    struct {
        float x, y, z;
        auto& operator=(float f) { y = f; return *this; }
        operator       float&() &        { return  y; }
        operator const float&() const &  { return  y; }
        operator       float () &&       { return  y; }
        float* operator&()               { return &y; }
    } y;
    
    struct {
        float x, y, z;
        auto& operator=(float f) { z = f; return *this; }
        operator       float&() &        { return  z; }
        operator const float&() const &  { return  z; }
        operator       float () &&       { return  z; }
        float* operator&()               { return &z; }
    } z;
    
    struct {
        float x, y, z;
        auto& operator=(float f) { x = y = f; return *this; }
    } xy;
    
    struct {
        float x, y, z;
        auto& operator=(float f) { y = z = f; return *this; }
    } yz;
    
    struct {
        float x, y, z;
        auto& operator=(float f) { z = x = f; return *this; }
    } zx;
};

另一个依赖的是owner_of在这里实现:https://gist.github.com/xymopen/352cbb55ddc2a767ed7c5999cfed4d31这可能取决于一些技术上特定于实现的(可能是未定义的)行为:

struct Vector3 {
    float x;
    float y;
    float z;
    
    [[no_unique_address]]
    struct {
        auto& operator=(float f) {
            Vector3* v = owner_of(this, &Vector3::xy);
            v->x = v->y = f;
            return *this;
        }
    } xy;
    [[no_unique_address]]
    struct {
        auto& operator=(float f) {
            Vector3* v = owner_of(this, &Vector3::yz);
            v->y = v->z = f;
            return *this;
        } 
    } yz;
    [[no_unique_address]]
    struct {
        auto& operator=(float f) {
            Vector3* v = owner_of(this, &Vector3::zx);
            v->z = v->x = f;
            return *this;
        }
    } zx;
    [[no_unique_address]]
    struct {
        auto& operator=(float f) {
            Vector3* v = owner_of(this, &Vector3::zx);
            v->x = v->y = v->z = f;
            return *this;
        }
    } xyz;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何同时更新结构体的多个字段? 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • 对于单个布局 XML 文件来说,多少个 ViewStub 太多了?

    我在 XML 文件中定义了布局 base layout xml 其中可能包含20 ViewStub除了 3 5 个其他视图 例如ImageView and a LinearLayout含3 5个ImageButton views 我应该关心
  • 跨多列排列的唯一约束

    给定 Postgres 数据库中的以下三列 第一 第二 第三 如何创建一个约束以使排列是唯一的 E g If foo bar shiz 存在于数据库中 bar shiz foo 将被排除为非唯一 您可以使用 hstore 创建唯一索引 CR
  • 如何让 Jenkins 从代码覆盖率中排除整个文件夹?

    我试图弄清楚如何从 jacoco 由 Jenkins 启动 生成的代码覆盖率报告中排除文件夹列表 似乎可以排除类 但不能排除文件夹 这对我来说很烦人 因为我已经开始使用一个相当大的库用于在线支付系统 运行这些单元测试意味着不断在该平台上创建
  • lua中分割字符串并存储在数组中

    我需要分割一个字符串并将其存储在一个数组中 这里我使用了 string gmatch 方法 它精确地分割字符 但我的问题是如何存储在数组中 这是我的脚本 我的示例字符串格式 touchedSpriteName Sprite 10 rose
  • 找出真实的文件类型

    我正在开发一个处理文件上传的 ASP 网页 仅允许上传某些类型的文件 例如 XLS XML CSV TXT PDF PPT 等 我必须确定文件是否确实具有与扩展名显示的类型相同的类型 换句话说 如果一个木马程序被重命名为无害 pdf并上传后
  • 将参数传递给 threading.Thread

    我在 Windows 上使用 Python 3 我在用threading Thread动态运行一个函数 我可以带或不带参数调用它 我正在设置一个事物列表 其中第一项是定义路径的字符串 其他参数将在列表中稍后列出 所以 args 可能等于 C
  • SQL Server - 如何查找我的表上的依赖表?

    Using SQLServer 我有一张桌子user id name email 还有一些其他的表 大约200多个表 其中一些使用user id作为外键cascade delete 所以 我想找出 哪些表使用这个外键 user id 我正在
  • 有没有办法减慢网络爬虫的速度,以便它能够获取代码?

    我写了一个宏去WU获取历史数据 大部分情况下 它是有效的 但是 我认为宏运行速度太快 无法从网站获取数据 https www wunderground com history daily us tx el paso KELP date 20
  • 谷歌翻译获取当前语言

    在网上找到任何可以帮助我的东西之后 我正在使用多语言网站的当前功能 function googleTranslateElementInit new google translate TranslateElement pageLanguage
  • 当另一个单元格更改时,在单元格中输入当前日期

    我有一个 Google 电子表格 用于跟踪客户端请求的应用程序配置信息的状态 例如 文本转到按钮上 我的顶部有一个 状态 列 下面的行中有一个 范围列表 数据验证单元格 使用的范围有 与客户 与我 已完成 我的右侧还有一列 用于手动添加上次
  • 如何将 PySpark 数据帧的每个非字符串列与浮点常量相除或相乘?

    我的输入数据框如下所示 from pyspark sql import SparkSession spark SparkSession builder appName Basics getOrCreate df spark createDa
  • Jhipster + REST 客户端 + 身份验证

    我需要了解如何验证 REST 客户端 可能是 Paw 可能是 Android 应用程序 使用 AFNetworking 和 jHipster 的 iOs 应用程序 我认为 更一般地说 使用 spring boot 我不是这方面的专家 虽然我
  • 使用 useEffect 更新 useReducer 'state'

    在我的应用程序中 我使用 React Hooks Context API 现在 每当我的 Provider 组件安装时 我都需要将从 localStorage 获取的数据分配给initialState carts state carts 如
  • 我可以将任意函数传递给 Scala 中的另一个函数吗?

    我是 Scala 的新手 能够将函数传递给其他函数非常巧妙 但是我可以传递一个随意的函数引用另一个函数 所述函数参数的数量将是固定的 也就是说 我也很好奇是否也可以传递具有任意数量的函数 我总是被类型错误绊倒 我尝试过使用Any但这似乎没有
  • 如何使用 iPhone 的 json 解析对象数组

    我在解析 JSON 结果中的对象数组时遇到问题 first name vijay last name last creditCardNumber 178978977779787979 month 02 year 2012 address A
  • 打开远程文档并保存回远程服务器

    我为我的办公室编写了一个在服务器上运行的网络应用程序 我们所有的文档也都在服务器上 我希望能够让用户通过我的网络应用程序浏览服务器上的文件夹 在编辑器 在线或桌面 中打开它 能够编辑它并将其保存回服务器的位置被打开 我一直在研究 Googl
  • Java:确定当前 Windows 用户的编程方式

    我看到很多类似的问题 但是我想使用 Java 查找当前登录用户的用户名 它可能是这样的 System getProperty current user 但是 我不太确定 你实际上非常接近 这就是您正在寻找的 System getProper
  • MemoryStream,无法访问关闭的流

    随着sharpPDF我生成一个 pdf 内存流 我想通过电子邮件直接发送它 但是 ms Seek 行给出了一个 ObjectDisposeException 无法访问关闭的流 pdf CreatePDF 方法采用 输出 文件名字符串或 输出
  • 如何为在 main() 外部和内部声明的变量分配内存

    我注意到 在处理一些大型数组 例如双倍 1000 x 1000 时 如果我在 main 内部声明数组 则我的程序会耗尽内存 但如果我在 main 外部声明数组 则这种情况似乎永远不会发生 即使是更大的阵列 有人可以解释一下区别是什么吗 当在
  • 如何同时更新结构体的多个字段?

    假设我有一个结构 struct Vector3 float x float y float z 注意sizeof Vector3 必须保持不变 编辑 我对没有设置器的解决方案感兴趣 我们不要创建该结构的实例Vector3 pos 我怎样才能