【发布时间】:2015-12-11 18:26:58
【问题描述】:
typeid 允许在运行时为每种类型分配唯一的std::type_index。我也想做同样的事情,静态地使用两个元函数:
// Get a unique integral number associated with the provided type
template <class T>
struct encode_type
{
using type = T;
static constexpr std::size_t value = /* Metaprogramming magic */;
};
// Get the type uniquely associated with the provided value
template <std::size_t V>
struct decode_type
{
static constexpr std::size_t value = V;
using type = /* Metaprogramming magic */;
};
有没有办法在 C++11 中做到这一点?
【问题讨论】:
-
为什么要这个,因为在编译时你得到了类型本身?
-
排除一些邪恶的黑客,我认为在编译时计数(或生成其他唯一整数)是不可能的,除非你愿意枚举所有类型这应该可以工作(
tuple<Ts...>,然后使用索引)。 -
正如我在下面指出的,答案是“不”。但是,您的要求可能比实际需要的多。很可能您有一个应用程序,而这正是您想要尝试的。但是你没有在上面包括你的首要动机。随意提出一个问题,包括您在另一个问题中真正想做什么!
-
另一个潜在的困难与编译单元之间的链接/协议有关。 Yakk 已经表明你不能为所有类型普遍实现它。有人建议你可以在一个元组中枚举一个它应该工作的类型的全局列表,但这没有吸引力。您可以想象使用宏自动累积应该工作的类型列表,或者更好的是,懒惰地“注册”类型,即在评估元函数时。但我认为在编译单元之间保持类型编号对同步是非常困难的。
-
类似于this 和this 的东西可能会起作用,但CWG hates it,所以我看不出有什么意义。
标签: c++ templates c++11 types template-meta-programming