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 function
name
返回
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
终止符的数组,则它将以与single
char
相同的方式打印

关键是,您不能将
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