Я новичок в clang и хочу использовать его для синтаксического анализа файлов заголовков C ++, чтобы выгрузить найденные в них определения классов. Ниже приведен пример заголовочного файла test.h:
template <typename T>
class Foo
{
void hello() {};
private:
T* data;
int length;
};
template <>
class Foo <bool>
{
private:
unsigned int *data;
int length;
};
Я использую «RecursiveASTVisitor» для подключения моих методов сброса, как показано ниже:
bool
ParserASTVisitor::VisitClassTemplateDecl(clang::ClassTemplateDecl *recDecl)
{
if (!recDecl) {
return true;
}
recDecl->dump();
}
Я получаю следующий дамп:
ClassTemplateDecl 0x1c73860 <test.h:1:1, line:9:1> Foo
|-TemplateTypeParmDecl 0x1c73720 <line:1:11, col:20> typename T
`-CXXRecordDecl 0x1c737d0 <line:2:1, line:9:1> class Foo definition
|-CXXRecordDecl 0x1ca6080 <line:2:1, col:7> class Foo
|-CXXMethodDecl 0x1ca6160 <line:4:5, col:19> hello 'void (void)'
| `-CompoundStmt 0x1ca6398 <col:18, col:19>
|-AccessSpecDecl 0x1ca6220 <line:6:5, col:12> private
|-FieldDecl 0x1ca62c0 <line:7:5, col:8> data 'T *'
`-FieldDecl 0x1ca6320 <line:8:5, col:9> length 'int'
Я не понимаю, почему я не вижу определение специализированного класса? Кроме того, если я изменю test.h, как показано ниже:
template <>
class Foo <bool>
{
private:
unsigned int *data;
int length;
};
template <typename T>
class Foo
{
void hello() {};
private:
T* data;
int length;
};
, я получу следующий дамп:
CXXRecordDecl 0x231b760 <test.h:2:1, line:7:1> class Foo definition
|-CXXRecordDecl 0x231b870 <line:2:1, col:7> class Foo
|-AccessSpecDecl 0x231b900 <line:4:5, col:12> private
|-FieldDecl 0x231b970 <line:5:5, col:19> data 'unsigned int *'
`-FieldDecl 0x231b9d0 <line:6:5, col:9> length 'int'
, который предназначен только для специализированного класса шаблонов.