【发布时间】:2021-11-07 04:06:43
【问题描述】:
我正在尝试执行以下操作:
template <typename type>
struct GetUniqueTypeValue
{
constexpr static void* get()
{
return (void*)&GetUniqueTypeValue::get;
}
};
constinit static void* record_array[16]{};
constexpr void * sequentialise(void* type_value)
{
return nullptr; // I want to return a seuqntialised number here.
}
int main()
{
constexpr void* type_value = GetUniqueTypeValue<int>::get();
}
我知道typeid() 和type_index 的值不是编译时值,所以这就是我使用函数指针方法的原因,它应该保证是唯一的,对吧?但是,我被困在这部分。我想要的基本上是一个用于类型 ID 的顺序计数器,这种方式通常在运行时使用某些技巧完成,例如每次调用 getID() 函数时或在启动时初始化 static 对象时递增一个计数器。除了我希望它是编译时。
我该怎么做? 编辑:我的意思是没有将每种类型都输入到函数中。我的意思是喜欢这个技巧:
struct SequentialiseTypes
{
static inline int counter = 0;
template <typename T>
int getID() { return counter++; }
}
或其他方式:
int counter = 0;
template <typename T>
int ID = counter++;
编译时除外
【问题讨论】:
-
您是否需要每个 ID 都是唯一的:(1) TU,(2) 单个可执行文件/共享库,或 (3) 可执行文件加上所有共享库?在编译时只有 (1) 是可能的。
-
@HolyBlackCat 每个类类型,所以 template
struct OuterClass { template int get_sequentialised_unique_id( ) { } }; -
这不是我要问的。假设您有两个 TU,每个 TU 打印一个 ID(不同类型)。您同意他们获得相同的 ID(即
0)吗?因为没有办法防止 TU 之间的连续 ID 冲突。 -
@HolyBlackCat 如果您在标题中定义了一个 constexpr 函数来执行此操作并将其粘贴到多个翻译单元中,那么您是说在传递唯一数字时无法获得相同的结果,或者函数 ptr 到 constexpr 函数,对于传入的每个 ptr 值或数字得到相同的结果?
-
我不明白你评论的后半部分,但是是的,当然不可能在 TU 之间交流 ID,所以不同的 TU 会看到不同的 ID。如果这不是您想要的,您将不得不接受非顺序 ID,例如类型名称的哈希(可以在编译时计算)。