2

たとえば、次のクラスがあります。

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

CXXRecordDeclofの AST にFooは、インスタンス化された型に関する情報を含めるべきではないことを理解しています。このリンク情報が AST の別の場所に保存されているのか、どうすれば取得できるのか疑問に思っていました。


私の現在の解決策は、初期化されていないテンプレートパラメーターを順番に取得し、それらを に保存すること{A, B, C}です。次に、インスタンス化呼び出しを見つけ、インスタンス化された型を別の に順番に格納し、それらをインデックスでリンクして取得します。template<typename A, typename B, typename C> class Baz {};std::vectorBaz<Foo, Bar, Baz>std::vector

{ A: Foo, B: Bar, C: Baz}

これは非常に複雑で、「un-Clang」のようです。

4

2 に答える 2