【问题标题】:Is there a C++ function to compare types of variables? [duplicate]是否有 C++ 函数来比较变量的类型? [复制]
【发布时间】:2020-08-06 05:46:09
【问题描述】:

在Python中,比较变量的类型,有函数“type”,例如:a = 10 and b = "abc", type (a)! = 类型 (b)。 C ++中有类似的东西吗?我有一个基类对象的向量,我想查看该向量的元素是否已声明为派生类。

【问题讨论】:

  • 可能有办法check if an object is a subclass另一个对象。
  • 我有一个基类对象的向量 如果你的向量不存储指针,你不会有任何派生类对象吗? Edit 包含显示您的声明以及您如何使用它的代码的问题。
  • 这能回答你的问题吗? typeid operator in C++
  • 这是一个重复的问题,我已经看到一个类似的问题,但找不到确切的问题。
  • @Ender_The_Xenocide 是 How do I get the type of a variable? 吗?

标签: c++


【解决方案1】:

假设您有一个继承自class Bclass D,以及一个D 类型的object。但是由于某种原因,您对该对象只有一个B*

然后dynamic_cast<D*>(object) 计算为指向同一对象的D*。有一个运行时检查以确保转换是安全的;如果你尝试将你的对象转换为它不继承自的派生类型,你会得到一个空指针。

您也可以dynamic_cast 引用,如果失败则抛出std::bad_cast 异常。

如果您想要执行这些类型的运行时强制转换,您真正想要的是std::vector<B*>,而不是std::vector<B>。如果您实际上声明了std::vector<B>,那么它们中的任何一个都不能成为D。但是B* 可以指向一个普通的BB 的任何派生类型。

【讨论】:

  • 您推荐std::vector<B*>而不是std::vector<B&>有什么具体原因吗?
  • 从技术上讲,std::reference_warpper 是针对此类事情引入的。
【解决方案2】:

在 C++ 中,变量是静态类型的。

bool eq_typed = std::is_same_v<std::decay_t<decltype(a)>, std::decay_t<decltype(b)>>;

【讨论】:

    【解决方案3】:

    是的,它称为 typeID

    https://en.cppreference.com/w/cpp/language/typeid

    if (typeid(a) == typeid(int()))
    //code here
    

    【讨论】:

    • 可能要注意typeid 是语言中的运算符,而不是函数。
    • 这不适用于继承,派生类(和对象)的 typeid 与其基类不同。
    猜你喜欢
    • 2019-01-23
    • 2016-01-13
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多