5

テンプレートテンプレートパラメーターを使用して、テンプレートクラスの実体化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た。

[編集 #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 軽量アカウントでサインインする必要があることに注意してください。アカウントの作成手順については、このページを参照してください。

4

1 に答える 1

3

これを試して:decl->getQualifiedNameAsString();

現時点でclang/libclangは適切なパーツがあるように見えますが、フルネームを印刷するだけの適切でシンプルなソリューションはありません。

これを参照してください http://lists.llvm.org/pipermail/cfe-dev/2015-October/045473.html

clingしかし、そのような機能を実装することに基づくプロジェクトがありclangます。ここを見てください:

https://root.cern.ch/gitweb?p=root.git;a=blob;f=interpter/cling/include/cling/Utils/AST.h;h=91cea2ef82f6a6b2ed4671d43253b1c0ebd86fd4;hb=HEAD

std::string GetFullyQualifiedName(clang::QualType QT,
                                        const clang::ASTContext &Ctx);

まさにあなたが探しているものです。あなたの例を申請した後、それが返されますns::A<ns::B>

彼らはこの機能を次回以降のclang/libclangリリースに統合するように見えるので、うまくいくことを願っています.

于 2015-11-11T04:21:52.280 に答える