DEENESPTFRRUARHIKOZHNL

结构体 std::hash< ara::core::Variant<

[SWS_CORE_01668]

template <typename... Types> struct hash< ara::core::Variant< Types...            > > {...};

Specialization of std::hash (hashing function for ara::core::Variant<Types...>)

Header-Datei#include "ara/core/variant.h"
Forwarding-Header#include "ara/core/core_fwd.h"
Scopenamespace std

用户指南人工智能生成

支持通过哈希值将类型安全的 Variant 用作无序标准容器中的键。
AI 生成 未审核 模型: gemini-3.8-flash-medium · 推理强度: medium · 温度: 不可控 · 提示词: 9c32f84b6c4d 来源 未决问题(3)
译自德文指南gemini-3.8-flash-low · 2026-10-13 · 德文原文

支持通过哈希值将类型安全的 Variant 用作无序标准容器中的键。

该模板特化为类型安全的 union 类型提供哈希函数,以便能够将其无缝用于关联哈希容器中。它充当符合标准的函数适配器,读取实例的状态并将其转换为唯一的散列值。使用的先决条件是类型列表中包含的所有备选类型均具有可哈希性。在内容保持不变的情况下,求值具有并发安全性且无副作用。

上下文

模板特化 std::hash<ara::core::Variant<Types...>> 为 AUTOSAR Adaptive 核心类型 ara::core::Variant 扩展了 C++ 标准库的标准化哈希框架。在模块 core 内,ara::core::Variant 充当类型安全、内存优化的 union,在任何给定时间都可以精确容纳已定义备选类型列表中的一个实例。为了能够将此类 Variant 数据结构用作关联哈希容器(如 std::unordered_map 或 std::unordered_set)中的键,std::hash 的相应特化是必不可少的。

因此,该特化在 AUTOSAR Adaptive Platform 的功能要求与标准库的泛型算法和容器之间进行无缝中介。它使软件组件能够对多态数据结构进行高效的索引、转发或暂存,而无需动态类型转换或用户定义的包装仿函数。

生命周期

哈希特化的生命周期极其轻量,并遵循 C++ 标准仿函数的约定。该类不具有持久状态变量或引用的资源。因此,创建是通过隐式默认构造函数平凡完成的,通常直接在栈上的使用位置或作为容器操作中的临时对象。

由于该特化是无状态的,该对象应该可以不受限制地复制和移动。 问题 Q-2cffd290e7f00968 (未决)销毁不需要显式释放资源或析构函数逻辑。关于并发性,只要要哈希的 ara::core::Variant 实例没有被另一个执行线程同时修改,调用仿函数就是线程安全的。多个线程可以同时使用哈希仿函数的同一实例或并行实例,而无需外部同步。

使用路径

典型使用是通过标准库的关联容器间接进行,或者通过显式执行调用运算符 operator() 直接进行。用例始于提供保存有具体备选值的已初始化的 ara::core::Variant 实例。

调用哈希函数时,会查询 Variant 的当前状态。该计算应该分两个概念性子步骤进行:首先,确定当前所持类型的判别器(discriminator)或索引。 问题 (未决)随后,将 Variant 中包含的具体值传递给该类型的匹配 std::hash 特化。最后,将类型索引和值哈希相互组合,以生成类型为 std::size_t 的结果散列值。这确保了具有相同备选值但不同类型标识的 Variant 能够可靠地获得不同的哈希值。

错误场景

哈希计算的稳健性主要取决于模板参数和所传入 Variant 的状态。一个基本先决条件是为参数包 Types... 中声明的所有类型都存在 std::hash 的可用特化。即使仅缺少一个类型的此类定义,一旦哈希仿函数被实例化,编译就会失败。

在运行时,该方法要求传入的 Variant 不是无效的。如果底层的 Variant 对象由于先前失败的赋值而进入了异常性空状态,则哈希计算的行为推测为未定义或导致运行时异常。 问题 Q-d1e0b4858aa9dc16 (未决)此外,各个备选类型的哈希计算预期不会抛出异常,以满足标准哈希函数的要求。

本文由 AI 基于 AUTOSAR 规范 R25-11 生成。

UML 类图

Hohle Dreieckspfeile = Vererbung (zeigt zur Basisklasse); Klicken öffnet die jeweilige Klassenseite.

G nstd__hash__ara__core__Variant_545 «struct» hash< ara::core::Variant< n_core__Variant__Types__________________609 :core::Variant< Types...            > > nstd__hash__ara__core__Variant_545->n_core__Variant__Types__________________609