1

我想知道你是否可以问一个变量它在 C++ 中是什么数据类型?我也知道 Scheme,你只需要这样做:

(define x 5)
(number? x)

它会返回“真”。在 C++ 中这样的事情可能吗?

4

6 回答 6

7

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 */ }
}
于 2013-11-04T17:30:16.260 回答
5

没有这样的元数据存储在 C++ 变量中。Anint只是一个int,它恰好需要 an 所需的字节数int,并且没有额外的信息可以让您找到它的类型。

此外,C++ 中的变量只是一块内存。您可以将它作为一个int,作为一个 s 的数组char,作为一个struct等来处理。没有什么可以阻止您将指针指向 anint并将其转换为char。那么它的类型是什么?int? char? 实际上没什么,C++ 中的类型只是解释驻留在内存中的字节的一种方式。

于 2013-11-04T17:28:46.240 回答
2

我想知道你是否可以问一个变量它在 C++ 中是什么数据类型?

不适用于基元(例如您的“数字”,它将是一个整数)。对于多态类,可以使用RTTI

实际上,有一种适用于原语的方法:typeid运算符:

#include <iostream>
#include <typeinfo>

int main()
{
    int i = 0;
    std::cout << typeid(i).name() << std::endl;
    return 0;
}
于 2013-11-04T17:29:27.310 回答
2

在编译时,你有decltype. decltype(expression)将产生表达式的类型。

如果您想要有关运行时的信息,您应该使用 RTTI(运行时类型信息)std::type_infostd::type_index.

std::type_info例如,允许您在运行时获取类名。

您可以type_info通过使用typeid运算符获得。(它将返回一个std::type_info const&

于 2013-11-04T17:30:21.227 回答
0

只是以非常非常有限的方式。如果变量的类型是用户定义的(类或结构)并且类/结构至少有一个虚方法,则可以使用typeid 运算符获取运行时类型信息。请注意,如果它不是类/结构类型或没有虚拟方法,它将为您提供静态类型(即变量的声明类型)。

于 2013-11-04T17:31:02.917 回答
0

并不真地。有一个typeid运算符,但这仅适用于多态类型,int而其他本机类型则不适用。

还有decltype一个评估声明的类型,但我怀疑这真的是你所追求的。

此外,这并不是真正的 C++ 做事方式。C++ 是一种静态类型语言,与许多其他语言不同,其中变量的类型几乎是无关紧要的。C++ 的基本原则之一是类型安全,其中变量的类型是已知的并且没有歧义。

如果您发现自己在编写 C++ 代码并且需要使用某种机制来发现某物的类型,我会说您可能正在与该语言作斗争。不要尝试使用 C++ 编写 Scheme 代码。

于 2013-11-04T17:34:15.400 回答