たとえば、次のクラスがあります。
template<typename T>
class Foo {
public:
T getBar();
private:
T bar_;
};
次のようにインスタンス化されます。
Foo<Bar> foo;
clang::CXXRecordDecl
のノードを抽出し、class Foo
そのフィールドを反復処理します。
for (const clang::FieldDecl *fieldDecl: fooRecordDecl->fields()) {
// fieldDecl->getType() gives T
// fieldDecl->getNameAsString() gives bar_
}
fieldDecl->getInstantiatedType()
私はそれをする何かが欲しいBar
CXXRecordDecl
ofの AST にFoo
は、インスタンス化された型に関する情報を含めるべきではないことを理解しています。このリンク情報が AST の別の場所に保存されているのか、どうすれば取得できるのか疑問に思っていました。
私の現在の解決策は、初期化されていないテンプレートパラメーターを順番に取得し、それらを に保存すること{A, B, C}
です。次に、インスタンス化呼び出しを見つけ、インスタンス化された型を別の に順番に格納し、それらをインデックスでリンクして取得します。template<typename A, typename B, typename C> class Baz {};
std::vector
Baz<Foo, Bar, Baz>
std::vector
{ A: Foo, B: Bar, C: Baz}
これは非常に複雑で、「un-Clang」のようです。