鉴于以下情况:
template<typename T>
class A
{
public:
static const unsigned int ID = ?;
};
我希望 ID 为每个 T 生成一个唯一的编译时 ID。我考虑过__COUNTER__
和 boost PP 库,但到目前为止还没有成功。我怎样才能实现这个目标?
编辑:ID 必须可用作 switch 语句中的情况
Edit2:所有基于静态方法或成员的地址的答案都是不正确的。尽管它们确实创建了唯一的 ID,但它们在编译时并未解析,因此不能用作 switch 语句的情况。
假设有一个符合标准的编译器(相对于一个定义规则),这就足够了:
template<typename T>
class A
{
public:
static char ID_storage;
static const void * const ID;
};
template<typename T> char A<T>::ID_storage;
template<typename T> const void * const A<T>::ID= &A<T>::ID_storage;
来自 C++ 标准 3.2.5 一条定义规则 [basic.def.odr](粗体强调是我的):
...如果 D 是一个模板并且在多个翻译中定义
单位,则应适用上面列表中的最后四项要求
模板中使用的模板封闭范围中的名称
定义(14.6.3),以及从属名称
实例化(14.6.2)。如果 D 的定义满足所有这些
要求,那么程序的行为就好像有一个单一的
D 的定义如果 D 的定义不满足这些
要求,那么行为是未定义的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)