我在typeid(var).name()
头文件下使用了#include <typeinfo>
函数,我看到它只返回一个字符。
例如
#include <iostream>
#include <typeinfo>
int main()
{
std::cout << typeid(5).name() << std::endl;
std::cout << typeid(5.8).name() << std::endl;
return 0;
}
输出:
i
d
所以,它显然会回归人物。
现在我正在尝试另一个出现错误的程序:
type.cpp:8:46: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
if(typeid((-1 + sqrt(1 - 8 * t)) / 2).name() == 'i')
,程序是:
#include <math.h>
#include <iostream>
#include <typeinfo>
int main()
{
int t;
std::cin >> t;
if(typeid((-1 + sqrt(1 - 8 * t)) / 2).name() == 'i')
std::cout << "YES";
else
std::cout << "NO";
return 0;
}
为什么我收到此错误?
答案 0 :(得分:2)
成员函数name
返回类型为const char *
的指针,同时您尝试将其与char
类型的对象进行比较,该对象由于整数提升而转换为类型{{1} }。
int
因此编译器会发出错误。
您可以使用标头if( typeid((-1+sqrt(1-8*t))/2).name() == 'i' )
^^^^
char converted to int
中声明的标准函数std::strcmp
。例如
<cstring>
然而,它是实现定义的函数if( std::strcmp( typeid((-1+sqrt(1-8*t))/2).name(), "i" ) == 0 )
生成的字符串。
答案 1 :(得分:1)
typeid
返回std::type_info
个对象,std::type_info::name
返回const char*
(指针)。如果此const char*
指向包含一个字符和NUL
终止符的数组,则其打印方式与单char
相同。
关键是,您无法将const char*
与char
进行比较。用于交叉c样式字符串(带有c样式字符串)的函数是std::strcmp
。
但是......这不是typeid
的用例。表达式的类型:
(-1 + sqrt(1 - 8 * t)) / 2)
在编译时已知,不在运行时根据其值进行更改。它始终是float
。请注意,您可以使用以下命令检查类型(在编译时):
std::is_integral<decltype((-1 + sqrt(1 - 8 * t)) / 2)>::value
decltype
中的表达式不需要进行评估(并且不可能)来获取表达式的类型。
但是,您基本上需要this。