テンプレートテンプレートパラメーターを使用して、テンプレートクラスの実体化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 軽量アカウントでサインインする必要があることに注意してください。アカウントの作成手順については、このページを参照してください。