gpt4 book ai didi

c++ - 如何在C++中检查指针的类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:04 26 4
gpt4 key购买 nike

我有以下代码:

// Example program
#include <iostream>
#include <string>
#include <typeinfo>

using namespace std;

class Name
{
int a;
int b;
};

class Name1
{
int a;
int b;
};


int main()
{

Name1* name1;
Name* name;

// trying to implement the following code:
// check if name1 is of type of pointer Name1 then do someting
// check if name is of type of pointer Name then do someting

}

如何检查指针name1的类型?

Name1和Name没有被继承,不能使用dynamic_cast,那么如何判断一个指针的类型呢?

最佳答案

编译时间差:

您可以使用模板及其特化:

template <class T>
bool isName(T *t) { return false; } // normal case returns false

template <>
bool isName(Name *t) { return true; } // but for Name returns true

然后你可以区分你的代码,对于example :

Name *n; Name1 *n1;
cout << "(1): " << isName(n) << endl;
cout << "(2): " << isName(n1) << endl;

您当然可以使用 isName()根据对象的类别处理条件。

从设计的角度来看,如果您有特定于类的代码,那么将它包装在一些模板中并使用上面演示的特化可能会更有趣,不是为了返回 bool 值,而是为了完成要做的事情,因为example :

template <class T>
void doMyStuff(T *t) { } // in general do nothing

template <>
void doMyStuff(Name *t) { cout << "do something with Name*"<<endl; }

template <>
void doMyStuff(Name1 *t) { cout << "do something with Name1*"<<endl; }

...
doMyStuff(n);
doMyStuff(n1);

运行时微分:

如果您需要决定任意指针的运行时间,您需要动态运行时间类型信息。标准 C++ 具有 RTTI。但它要求类中至少有一个虚函数。所以你不能只拿任何指针(例如 void* )并找出它指向的数据!您需要一个指向有效多态类的指针。

最简洁的方法是制作 NameName1两者都继承自具有虚函数的技术通用类:

class vvoid {
virtual void mv() {};
};

然后你可以使用dynamic_cast <typeinfo> 使用对象的类型,并轻松使用指向基础对象的指针:

void f(vvoid *p){
cout<<"f("<<p<<"):"<<typeid(*p).name()<< endl;
}

然后您可以通过向它提供指向派生类的指针来调用此函数:

Name *n=new Name;
Name1 *n1=new Name1;
f(n); // no risk here, it's automatic conversion to base type
f(n1);

请注意,为了更好的设计,您还可以将任何特定于类的行为嵌入到虚函数中,该虚函数专用于每个派生类型。但这是可靠类设计的开始,您的假设是:不相关的类。

一种更容易出错的方法是保持这些类中的每一个独立,但确保每个类至少有一个虚函数,以确保它们是多态的并包含 RTTI 信息。

然后你可以使用危险的 reinterpret_cast并使用对 RTTI 信息的访问。 This code论证原理:

f(reinterpret_cast<vvoid*>(n)); 
f(reinterpret_cast<vvoid*>(n1));

这似乎有效。但是,如果您不小心转换了一个没有虚函数的类,您的代码将在编译时出现我们的警告,但在执行时会非常糟糕。

关于c++ - 如何在C++中检查指针的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28766149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com