需要实现一个函数,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序。