如何使用Clang从这个例子中获取基类?

时间:2014-08-18 09:31:09

标签: c++ clang

这是一个非常基本的代码示例,以及我想要的内容:

class B{
    // Implementation of class B
};
class D : public B{
    // Implementation of class D
};
int main(){
    try{
        // Code for try statement
    }
    catch(D & d){
        // Handler for D 
    } 
    catch(B & b){
        // Handler for B 
    } 
    return 0; 
} 

目前,我可以在处理程序中获取B类和D类的CXXRecordDecl(我可以从getCaughtType类中的CXXCatchStmt方法获取它们。

我想要做的是能够从D类访问B级CXXRecordDecl,因为我们有class D : public B

我在class CXXRecordDecl CXXRecordDecl class D上的{{1}}尝试了以下方法:

我现在没有想法。有人有想法吗?

1 个答案:

答案 0 :(得分:3)

这是 Joachim Pileborg 在评论中给出的答案的实施。

bool VisitCXXTryStmt(CXXTryStmt * tryStmt){
    int nbCatch = tryStmt->getNumHandlers(); 
    for(int i = 0 ; i < nbCatch ; i++){
        if(tryStmt->getHandler(i)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl() == nullptr){
            cout << "The caught type is not a class" << endl; 
        }
        else{
            cout << "Class caught : " << tryStmt->getHandler(i)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->getNameAsString() << endl;
        } 
        if(tryStmt->getHandler(i)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin() == nullptr){
            cout << "This class is the base class" << endl; 
        }
        else{
            cout << "Base class caught : " << tryStmt->getHandler(i)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin()->getType().getAsString() << endl;
        } 
        cout << "\n \n END OF LOOP \n \n" << endl; 
    } 
    return true; 
}

为问题中给出的示例产生以下输出:

抓住了类:D

捕获的基类:B类

END LOOP

被捕获的类:B

此类是基类

END LOOP