Распечатайте тип параметра (ParmVarDecl) с помощью API clang

Мне нужно напечатать тип параметра в исходном файле С++ с помощью API clang.

Если у меня есть представление параметра в clang (ParmVarDecl* param), я могу напечатать имя параметра с помощью param->getNameAsString(). Мне нужен метод param->getTypeAsString(), но такого метода нет. Так есть ли другой способ выполнить эту задачу?

Ответ 1

Получил ответ на мой вопрос в llvm irc:

Существует метод std::string clang::QualType::getAsString(SplitQualType split)

Итак, это работает для меня:

ParmVarDecl* param = *someParameter;
cout << QualType::getAsString(param->getType().split()) << endl;

Ответ 2

Вы можете использовать typeid, чтобы получить имя любого типа. Хотя он будет отличаться от компилятора к компилятору и не может быть красивым именем.

#include <iostream>
#include <typeinfo>

struct MyStruct { };

int main()
{
    std::cout << typeid(MyStruct).name() << std::endl;
}

Если вам нужно сделать это для большого количества классов, вы можете сделать часть вызова базового класса, тогда любой класс, который нуждается в функциональности, может просто наследовать от него.

#include <iostream>
#include <typeinfo>

class NamedClass
{
  public:
    virtual ~NamedClass() { }

    std::string getNameAsString()
    {
        return typeid(*this).name();
    }
};

class MyStruct : public NamedClass
{
};

int main()
{
    MyStruct ms;
    std::cout << ms.getNameAsString() << std::endl;
}