我想知道你是否可以问一个变量它在 C++ 中是什么数据类型?我也知道 Scheme,你只需要这样做:
(define x 5)
(number? x)
它会返回“真”。在 C++ 中这样的事情可能吗?
我想知道你是否可以问一个变量它在 C++ 中是什么数据类型?我也知道 Scheme,你只需要这样做:
(define x 5)
(number? x)
它会返回“真”。在 C++ 中这样的事情可能吗?
C++ 等价物可能是这样的:
auto x = 5;
using x_type = decltype(x);
你可以检查它
if( std::is_same<x_type,int>::value ) ...
但我不确定这是您的想法,因为 C++ 是静态类型的。当你有一个类层次结构时,还有动态类型:
struct Base { virtual ~Base() {} };
struct Derived1 : Base {};
struct Derived2 : Base {};
int main()
{
Base* p = new Derived2;
if( dynamic_cast<Derived1*>(p) ) { /* is Derived1 */ }
else if( dynamic_cast<Derived2*>(p) ) { /* is Derived2 */ }
else { /* neither */ }
}
没有这样的元数据存储在 C++ 变量中。Anint
只是一个int
,它恰好需要 an 所需的字节数int
,并且没有额外的信息可以让您找到它的类型。
此外,C++ 中的变量只是一块内存。您可以将它作为一个int
,作为一个 s 的数组char
,作为一个struct
等来处理。没有什么可以阻止您将指针指向 anint
并将其转换为char
。那么它的类型是什么?int
? char
? 实际上没什么,C++ 中的类型只是解释驻留在内存中的字节的一种方式。
我想知道你是否可以问一个变量它在 C++ 中是什么数据类型?
不适用于基元(例如您的“数字”,它将是一个整数)。对于多态类,可以使用RTTI。
实际上,有一种适用于原语的方法:typeid
运算符:
#include <iostream>
#include <typeinfo>
int main()
{
int i = 0;
std::cout << typeid(i).name() << std::endl;
return 0;
}
在编译时,你有decltype
. decltype(expression)
将产生表达式的类型。
如果您想要有关运行时的信息,您应该使用 RTTI(运行时类型信息)std::type_info
和std::type_index
.
std::type_info
例如,允许您在运行时获取类名。
您可以type_info
通过使用typeid
运算符获得。(它将返回一个std::type_info const&
)
只是以非常非常有限的方式。如果变量的类型是用户定义的(类或结构)并且类/结构至少有一个虚方法,则可以使用typeid 运算符获取运行时类型信息。请注意,如果它不是类/结构类型或没有虚拟方法,它将为您提供静态类型(即变量的声明类型)。
并不真地。有一个typeid
运算符,但这仅适用于多态类型,int
而其他本机类型则不适用。
还有decltype
一个评估声明的类型,但我怀疑这真的是你所追求的。
此外,这并不是真正的 C++ 做事方式。C++ 是一种静态类型语言,与许多其他语言不同,其中变量的类型几乎是无关紧要的。C++ 的基本原则之一是类型安全,其中变量的类型是已知的并且没有歧义。
如果您发现自己在编写 C++ 代码并且需要使用某种机制来发现某物的类型,我会说您可能正在与该语言作斗争。不要尝试使用 C++ 编写 Scheme 代码。