typeid(var_name).name()函数在C ++中返回什么?

时间:2016-02-02 13:29:42

标签: c++

我在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;
}

为什么我收到此错误?

2 个答案:

答案 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