C++ typeid(var_name).name()函数在C++;?
我使用了C++ typeid(var_name).name()函数在C++;?,c++,C++,我使用了#include头文件下的typeid(var).name()函数,发现它只返回一个字符 例如 因此,它显然返回字符 现在,我正在尝试另一个程序,错误是: 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 &l
#include
头文件下的typeid(var).name()
函数,发现它只返回一个字符
例如
因此,它显然返回字符
现在,我正在尝试另一个程序,错误是:
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;
}
#包括
#包括
#包括
int main()
{
int t;
标准:cin>>t;
if(typeid(-1+sqrt(1-8*t))/2.name()='i')
std::coutMember functionname
返回const char*
类型的指针,同时尝试将其与char
类型的对象进行比较,该对象由于整数提升而转换为int
类型
if( typeid((-1+sqrt(1-8*t))/2).name() == 'i' )
^^^^
char converted to int
因此编译器发出一个错误
您可以使用头文件
中声明的标准函数std::strcmp
if( std::strcmp( typeid((-1+sqrt(1-8*t))/2).name(), "i" ) == 0 )
但是,函数name
typeid
返回std::type_info
对象并返回const char*
(指针)生成的字符串是由实现定义的。如果此const char*
指向包含一个字符和一个NUL
终止符的数组,则它将以与singlechar
相同的方式打印
关键是,您不能将const char*
与char
进行比较。用于比较c样式字符串(与c样式字符串)的函数是std::strcmp
但是…这不是typeid
的用例。表达式的类型:
(-1 + sqrt(1 - 8 * t)) / 2)
在编译时已知,并且在运行时不会根据其值而更改。它将始终是浮点值
。请注意,您可以使用以下方法检查类型(在编译时):
std::is_integral<decltype((-1 + sqrt(1 - 8 * t)) / 2)>::value
std::is_integral::value
decltype
中的表达式不需要求值(也不能求值)来获取表达式的类型
但是,您基本上需要。这很有帮助。我们如何在运行时检查表达式类型?这std::is_integral::value
在这里对我有什么帮助?@Aryan表达式的类型不依赖于它的值。您在这里的意思可能是检查float
的值是否有点close是一个整数。你应该看到。“但是,函数名生成的字符串是由实现定义的。”我认为,值得强调的是!
(-1 + sqrt(1 - 8 * t)) / 2)
std::is_integral<decltype((-1 + sqrt(1 - 8 * t)) / 2)>::value