Я пытаюсь использовать libtooling
для печати CXXRecordDecl
обоснования класса шаблона с параметром шаблона шаблона. К сожалению, строковое представление параметра шаблона шаблона не является полным (например, отсутствуют пространства имен).
Я печатаю CXXRecordDecl
с помощью этого кода:
clang::PrintingPolicy policy = compiler_instance->getLangOpts();
std::string name = decl->getTypeForDecl()->getCanonicalTypeInternal().getAsString(policy);
Вот пример, когда я ожидал, что вывод будет ns::A<ns::B>
, но я получаю ns::A<B>
:
namespace ns {
template <template <class> class T>
class A {
T<int> x;
};
template <class T>
class B {
T y;
};
} // namespace ns
int main(int argc, char **argv)
{
using namespace ns;
A<B> z;
}
Как напечатать полное имя класса с параметром шаблона шаблона?
Кстати, есть ли способ сделать это без вызова getCanonicalTypeInternal
, который звучит как внутренняя функция?
[Редактировать #1] Я также пробовал decl->getQualifiedNameAsString()
, который полностью опускает аргументы шаблона и выводит ns::A
.
[Edit #2] Cling меняет один набор проблем на другой. Он правильно создает полные типы для параметров шаблона шаблона. Однако он создает неполные имена для аргументов и возвращаемых типов функций (и указателей на функции). Например, приведенный ниже код выводит ns::A<void (B)>
вместо ns::A<void (ns::B)>
:
namespace ns {
class B { };
template <class T>
class A { };
} // namespace
int main(int argc, char **argv)
{
using namespace ns;
A<void (B)> x;
}
[Редактировать #3] я опубликовал проблему на Cling средство отслеживания проблем для вышеуказанной проблемы. Обратите внимание, что для просмотра страницы необходимо войти в систему с облегченной учетной записью CERN. Инструкции по созданию учетной записи см. на этой странице.