gpt4 book ai didi

c++ - 在编译时生成唯一的类型标识符

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:17 25 4
gpt4 key购买 nike

我需要一种方法来为任何类型生成一个唯一标识符(字符串或整数),以便在一组模板函数中使用。 type_info::name() 的文档说它对于不同的类型可能不同,也可能不同,这让我很担心,因为我需要依赖它们的唯一性。 hash_code 可能也不是唯一的(根据名称判断,我还没有看过标准对此有何规定)。

我的问题主要是,在什么情况下 typeid(T).name() 可以唯一?

由于类型可以来自不同的 (DLL) 模块,我不能简单地使用全局计数器和模板静态函数。不过,线程安全不是问题,因为可能需要类型 ID 的函数保证一次只能由一个线程调用。

最佳答案

I need a way to generate a unique identifier (either string or integer) for any type for use in a set of template functions.

这些思路有帮助吗?

#include <cstdint>
#include <iostream>
using namespace std;

template <typename T>
class unique_id {
static char type_id;
public:
static uintptr_t get_ID() { return reinterpret_cast<uintptr_t>(&type_id); }
};

template <typename T>
char unique_id<T>::type_id;

struct { } s;

int main() {
cout << unique_id<int >::get_ID() << endl;
cout << unique_id<double >::get_ID() << endl;
cout << unique_id<decltype(s) >::get_ID() << endl;
cout << unique_id<size_t >::get_ID() << endl;
cout << unique_id<unsigned long>::get_ID() << endl;
}

LLVM 代码库中有类似的东西,因为它不使用 RTTI。但是,我未能找到该技巧的描述。甚至 30 分钟的谷歌搜索也无济于事;我已经放弃了。

My question mainly is, in what cases could typeid(T).name() be not unique?

我不知道那个问题的答案。我的猜测是标准没有强制要求;当然,它没有回答为什么的问题。

好的,请参阅 Michael J's answer .


更新:至于std::type_info::name(),标准似乎没有保证;返回的字符串对于多种类型可能是相同的,并且在同一程序的调用之间会发生变化。

一个选择是深入实现定义的领域:我会简单地在我关心的类型以及我关心的所有平台和编译器上测试它。如果它工作正常,那么我可能会冒险。

但是,有 std::type_info::operator==std::type_info::operator!= 可以解决您的问题:您可以区分类型彼此之间甚至似乎是有保证的。在您的应用程序中比较字符串或 type_info 对象是否重要?

关于c++ - 在编译时生成唯一的类型标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20869010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com