我写了个函数模板里用到了typeid,判断传入变量的类型。传入整型和浮点型都没问题,传入字符串直接编译不通过。
#include <iostream>
#include <typeinfo>
#include <string>
using namespace std;
struct Item
{
int intvalue=0;
double doublevalue=0.0;
string stringvalue="";
};
template <typename T>
void TypeDetect(Item *p, T elem)
{
if (*typeid(elem).name() == 'i')
p->intvalue = elem;
else if (*typeid(elem).name() == 'd')
p->doublevalue = elem;
else if (*typeid(elem).name() == 'P')
p->stringvalue = elem;
}
int main()
{
Item *p1 = new Item, *p2 = new Item, *p3 = new Item;
TypeDetect(p1, 1);
TypeDetect(p2, 1.1);
TypeDetect(p3, "abc");
cout << p1->intvalue << endl;
cout << p2->doublevalue << endl;
cout << p3->stringvalue << endl;
return 0;
}
直接编译上述代码会报错:
invalid conversion from 'const char*' to 'int' [-fpermissive] [15, 21]
cannot convert 'const char*' to 'double' in assignment [17, 24]
但注释掉
TypeDetect(p3, "abc");
就可以编译运行了。这是为什么?传入字符串后typeid应该会判断它是一个指针,然后通过if语句判断,但似乎编译器就不认我写的三个if语句。