【发布时间】:2011-01-09 18:50:22
【问题描述】:
我想要一种为任何 C++ 用户定义类型创建唯一编译时标识符的通用方法。
例如:
unique_id<my_type>::value == 0 // true
unique_id<other_type>::value == 1 // true
我已经设法使用预处理器元编程来实现类似的东西,但问题是,序列化并不一致。例如,如果类模板 unique_id 首先用 other_type 实例化,那么我的程序以前版本中的任何序列化都将失效。
我已经搜索过这个问题的解决方案,如果唯一值是编译时常量,我发现有几种方法可以通过不一致的序列化来实现这一点。如果使用 RTTI 或类似方法,如 boost::sp_typeinfo,则唯一值显然不是编译时常量,并且存在额外开销。这个问题的一个临时解决方案是,以正确的顺序在单独的标头中实例化所有 unique_id,但这会导致额外的维护和样板代码,这与使用 enum unique_id{my_type, other_type}; 没有什么不同。
这个问题的一个很好的解决方案是使用用户定义的文字,不幸的是,据我所知,目前没有编译器支持它们。语法是 'my_type'_id; 'other_type'_id; 和 udl。
我希望有人知道一个技巧,它允许使用当前标准 (C++03/C++0x) 在 C++ 中实现可序列化的唯一标识符,如果它与最新的稳定 MSVC 和GNU-G++ 编译器,虽然我希望有解决方案,但它不是可移植的。
我想澄清一下,使用mpl::set 或类似mpl::vector 和过滤的构造并不能解决这个问题,因为元集/向量的范围是有限的,实际上导致的问题不仅仅是预处理器元编程。
【问题讨论】:
标签: c++ c-preprocessor metaprogramming