、唯一の注意点は、私はstd::is_same<N<4>, N<4>>::value
がtrue
を返すために得ることができない、ということです。私はちょうど値に直接作用するconstexpr
メソッドを定義することができるので、私はそれで生きることができます。しかし、私は誰かがこれに対して正しい答えを提供できることを願っています。
私は完全な解決策と修正された入力をhttps://gist.github.com/4178490に入れました。
- 使用して、引数がClassTemplateSpecializationDeclにClassTemplateDeclをオンにすると、
- インスタンス化の専門は、使用して:
私は1つは、それはそれをクラステンプレートに引数を代用してインスタンス化するだろうことがわかりましたSema::InstantiateClassメソッド。
メソッドSema::RequireCompleteTypeは、間接的にInstantiateClassを呼び出し、入力が少なくて済みますので、代わりにこのメソッドを呼び出します。したがって、次のように記述します。
/**
* Instantiate a class template.
*/
ClassTemplateSpecializationDecl* instantiate(ASTContext& ast, Sema& sema,
DeclContext* parent,
ClassTemplateDecl* decl,
ArrayRef<TemplateArgument> args) {
void* ins_point;
auto retval = decl->findSpecialization(args.data(), args.size(), ins_point);
if (retval == nullptr) {
retval = ClassTemplateSpecializationDecl::Create(ast, TTK_Class, parent,
{}, {}, decl,
args.data(), args.size(),
nullptr);
decl->AddSpecialization(retval, ins_point);
}
bool is_incomplete = sema.RequireCompleteType({}, ast.getTypeDeclType(retval),
diag::err_incomplete_type);
return is_incomplete ? nullptr : retval;
}
このメソッドはClassTemplateDeclでのみ機能します。質問にはTypeAliasTemplateDeclもあります。このため、これはTypeAliasTemplateDeclを知る唯一のオブジェクトなので、TemplateDeclInstantiatorを直接呼び出します。おそらくこのメソッドはClassTemplateDeclでも動作しますが、TemplateDeclInstantiatorだけでは十分な作業ができないようです。
/**
* Instantiate a template alias (`template <...> using Foo = ...`).
*/
TypeAliasDecl* instantiate(ASTContext& ast, Sema& sema, DeclContext* parent,
TypeAliasTemplateDecl* decl,
ArrayRef<TemplateArgument> args) {
auto args_count = static_cast<unsigned>(args.size());
TemplateArgumentList arg_list {TemplateArgumentList::OnStack,
args.data(), args_count};
MultiLevelTemplateArgumentList multi_arg_list {arg_list};
TemplateDeclInstantiator instantiator {sema, parent, multi_arg_list};
auto instantiated = instantiator.Visit(decl);
if (auto inst_decl = dyn_cast<TypeAliasTemplateDecl>(instantiated)) {
return inst_decl->getTemplatedDecl();
}
return nullptr;
}
(私はそれは私の質問の範囲外である、FunctionTemplateDeclをスキップする。)
私は私はあなたがやろうとしているのか理解全くわからないが、なぜあなたはタイプIDを使用することはできませんか? –
@AndreiTita:これをC++パーサー(clang)で評価しようとしています。 – kennytm