使用c++11创建唯一类型ID
Creation of unique type ID with c++11
为什么下面的代码保证是唯一的类型id ?
using TypeId = uintptr_t;
template < typename T >
static TypeId GetTypeId()
{
static uint32_t placeHolder;
return (reinterpret_cast<TypeId>(&placeHolder));
}
来源我不明白为什么这不仅仅是一种随机的内存位置作为一种"滥用"…
简介
你是正确的,实现滥用"随机内存位置"块作用域静态变量的,但这并不意味着你正在谈论的保证不持有:从GetTypeId<T>
返回的将是唯一的每个实例化。
注意:但是应该意识到
uintptr_t
并不是保证在每个平台上都可用。实现该函数的一种完全可移植的方法是返回一个void*
,它保证能够保存程序中每个对象的每个地址。
不同的地址保证…
在 c++ 中有一个保证,每个对象必须驻留在一个唯一的地址,除非我们谈论的是一个对象是另一个对象的子对象。在这种情况下,它们可能具有相同的地址(并且在需要共享地址的情况下,如标准布局类及其第一个数据成员)。
1.8p6
c++对象模型[intro.object]
除非对象是位域或大小为0的基类子对象,否则该对象的地址为其占用的第一个字节的地址。两个不是位字段的对象可以有相同的地址,如果一个是另一个的子对象,或者如果至少一个是大小为零的基类子对象并且它们是不同的类型;
函数中的静态变量
我们还有一个显式的子句,说明包含静态变量的函数模板的每个特化都有该静态变量的唯一副本:
14.8p2
函数模板特化[temp.fct.spec]
从模板实例化的每个函数模板特化都有自己的静态变量副本。
由于声明为static的变量对于GetTypeId<T>
的每个实例化都是唯一的,其中T
是一个任意类型,因此在此模板特化中,每个名为placeHolder
的对象必须是唯一的对象。
它必须是唯一对象,并且;它必须有一个不同的地址
注1)在 c++ 11中,我们有
std::type_index
,它满足您所追求的保证。
注2) c++ 11标准草案n3337已被用作本文的参考
- 使用类型id运算符的最佳替代方法
- 类型ID,如何仅获取类型名称
- 自动初始值设定项类型ID 信息
- 类型ID指针和引用比较差异?
- gcc 发出了与解析新表达式中的类型 ID 相关的错误
- 我可以从静态基方法获取当前类类型 ID 吗?
- 关于C++中的类型id函数
- reinterpret_cast<类型ID>"type-id"可以是变量吗?
- 我想看到一个在整个后缀表达式的上下文中查找转换类型 id 的示例
- 每种类型的编译时类型ID
- C++模板和类型 ID
- C++类型比较:类型 ID 与双重调度dynamic_cast
- 编译时生成的常量类型 ID
- 类型id(T) 是在运行时还是在编译时被计算
- 如何在编译时生成密集的唯一类型ID
- 类型ID 和type_info类
- 函数未在类型id中调用
- 多态指针的类型id
- 类型id结果不匹配
- 类型ID的成本是多少?