C++ 如何在C+的运行时知道表达式的类型+;程序

C++ 如何在C+的运行时知道表达式的类型+;程序,c++,C++,以下是一个程序: #include<math.h> #include<cstring> #include<iostream> #include<typeinfo> int main() { int t; std::cin>>t; if( std::strcmp( typeid((-1+sqrt(1+8*t))/2).name(), "i" ) == 0 ) std::cout<<"YE

以下是一个程序:

#include<math.h>
#include<cstring>
#include<iostream>
#include<typeinfo>
int main()
{
    int t;
    std::cin>>t;
    if( std::strcmp( typeid((-1+sqrt(1+8*t))/2).name(), "i" ) == 0 )
        std::cout<<"YES";
    else
        std::cout<<"NO";
    return 0;
}
#包括
#包括
#包括
#包括
int main()
{
int t;
标准:cin>>t;
如果(std::strcmp(typeid(-1+sqrt(1+8*t))/2).name(),“i”)==0)

std::cout
typeid
只告诉您在编译时确定的静态类型。您正在编写的表达式始终是浮点表达式,因为
sqrt
typeid(int(-1+sqrt(1+8*t))/2))。name()
当然是
“i”

但我认为,您真正想知道的是,根据输入,该操作是否有整数结果。您最好检查计算值(始终是浮点值!)是否足够接近整数值,例如:

double val = (-1+sqrt(1+8*t))/2;
if (fabs(round(val) - val) < 1e-5) std::cout << "YES"; // and so on
double-val=(-1+sqrt(1+8*t))/2;

if(晶圆(val)-val)<1e-5Std::这不太有意义,因为没有多态性,表达式的类型永远不会改变。我不确定你的意思。那个表达式的类型是在编译时设置的。C++中唯一的动态类型是通过继承。我不确定,但是你是否希望如果计算返回一个整数?(即t==1),类型改变?这不是C++如何工作的,它仍然是<代码>浮点,但是值将是代码> 1。F< /Calp>。@ TBLLE,TalnLLAMA,是的,我想要相同的东西。这可以通过评估表达式并将其存储到浮点类型变量中,然后在十进制(?)之后检查数字来完成。如果它是0,那么我们可以把它看作一个整数吗?@ Ayranghan:你应该简单地把浮点转换成int和后退。然后将结果与原来的浮点进行比较。当相同的时候,这个数字是整数:<代码>如果(StasyType(StasyType(MySob))=MyFooLT)STD::CUT。