c++任意变量类型获取相关

该博客探讨了如何在C++中创建一个模板函数`get_unique_id<T>(T t)`,该函数能为不同类型的变量生成唯一的标识ID。作者提出了两种实现方法:一是利用模板函数的静态变量和全局计数器,二是通过`typeid`关键字结合映射表。第一种方法简单但会产生大量静态变量,且难以清理。第二种方法允许动态清理,但实现相对复杂。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    需要实现一个函数,template <class T> int get_unique_id(T t),传入任意类型的变量,变量类型相同时,返回值id相同,且如果为不同的变量类型返回的id不同(例如 get_unique_id(100)  参数为int类型,返回值为  1,get_unique_id(1000) 参数同样为int类型,返回值为 1, get_unique_id('A') 参数为char类型返回值为 2,get_unique_id('d')参数为char类型,返回值为 2...)。

   想法一:

    首先想到的实现方法:

    可以在模板函数get_unique_id()中定义一个static静态变量 初值为static int i = -1; 在外边定义一个全局变量int g_cout = 0;

    利用模板函数编译时,相同类型会使用同一个函数,不同类型会生成不同函数的机制进行生成(例如 get_unique_id(2) 和 get_unique_id(3) 都是整型,使用的是同一个函函数get_unique_id(int ),,而get_unique_id('C') 模板生成的函数是 get_unique_id(char)。考虑到每个函数里都有一个static int i 变量,通过外部全局变量的计数就能为每一个不同变量,返回

一个不同的id;代码实现如下:

int g_count = 0;
template<class T>
int get_unique_id(T t)
{
    static int unique_id = -1;

    if (unique_id  == -1) 
        unique_id  = g_count++;

    return unique_id ;
}

template<class T>
int get_unique_id()
{
    static int unique_id = -1;

    if (unique_id  == -1) 
        unique_id  = g_count++;

    return unique_id ;
}


int main()
{
	int i = 1, i1 = 3;
	char c = 'a', c1 = 'A';
	float f = 1.0, f1 = 2.5;
	double d = 2.5, d1 = 3.5;

	std::cout << get_unique_id(i) << get_unique_id(i1) << std::endl;
	std::cout << get_unique_id(c) << get_unique_id(c1) <<std::endl;
	std::cout << get_unique_id(f) << get_unique_id(f1) << std::endl;
	std::cout << get_unique_id(d) << get_unique_id(d1) << std::endl;

	std::cout << get_unique_id<int>() << get_unique_id<int>() << std::endl;
	std::cout << get_unique_id<char>() << get_unique_id<char>() <<std::endl;
	std::cout << get_unique_id<float>() << get_unique_id<float>() << std::endl;
	std::cout << get_unique_id<double>() << get_unique_id<double>() << std::endl;

	return 0;
}

输出结果:

可以实现需求

想法二:

可以通过typeid关键字识别出不同类型,再经过map查找,返回不同的id

实现如下:

std::map<std::string, int> g_type_name;
int g_count = 0;
template<class T>
int get_unique_id(T t)
{
	auto name = typeid(t).name();
	auto iter = g_type_name.find(name);

	if (iter == g_type_name.end())
	{
		int unique_id = g_count;
		g_type_name.insert(std::pair<std::string, int>(name, g_count++));
		return unique_id;
	}
	
	return iter->second;
}

template<class T>
int get_unique_id()
{
	auto name = typeid(T).name();
	auto iter = g_type_name.find(name);

	if (iter == g_type_name.end())
	{
		int unique_id = g_count;
		g_type_name.insert(std::pair<std::string, int>(name, g_count++));
		return unique_id;
	}
	
	return iter->second;
}



int main()
{
    int i = 1, i1 = 3;
	char c = 'a', c1 = 'A';
	float f = 1.0, f1 = 2.5;
	double d = 2.5, d1 = 3.5;

	std::cout << get_unique_id(i) << get_unique_id(i1) << std::endl;
	std::cout << get_unique_id(c) << get_unique_id(c1) <<std::endl;
	std::cout << get_unique_id(f) << get_unique_id(f1) << std::endl;
	std::cout << get_unique_id(d) << get_unique_id(d1) << std::endl;

	std::cout << get_unique_id<int>() << get_unique_id<int>() << std::endl;
	std::cout << get_unique_id<char>() << get_unique_id<char>() <<std::endl;
	std::cout << get_unique_id<float>() << get_unique_id<float>() << std::endl;
	std::cout << get_unique_id<double>() << get_unique_id<double>() << std::endl;
	return 0;
}

运行结果如下:

同样也能实现上述功能。

感觉上第一种较简单明了,不过会生成非常多static 全局静态变量,而且不具有可操作性,不能清空id(如果需要清空id,需要将所有类型的函数都执行一遍才能做到将每个函数中的static int unique置为-1),重新生成。

第二种想法,可以随时释放清空掉map中的内容,重新生成id序。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值