英語版
このページの英語版を見る

dmd.dtemplate

TemplateDeclaration,TemplateInstance といくつかのユーティリティを定義する。
このモジュールは2つの主要なテンプレート型を保持する: TemplateDeclaration これはユーザーが提供するテンプレートの宣言である、 のインスタンスであるTemplateInstanceTemplateDeclaration のインスタンスである。

テンプレート・パラメーター さらに、テンプレート・パラメータのクラスもこのモジュールで定義されている。 基底クラスであるTemplateParameter は継承される:

  • TemplateTypeParameter
  • TemplateThisParameter
  • TemplateValueParameter
  • TemplateAliasParameter
  • TemplateTupleParameter

テンプレート・セマンティック テンプレートのインスタンス化プロセスの開始は次のようになる:

  • TypeInstance 、またはTypeIdentifierTypeInstance TypeIdentifier がそうでないのに対して、Foo!(arg) などはbangがある。
  • TemplateInstance がインスタンス化される。
  • セマンティックがTemplateInstance (dmd.dsymbolsem を参照)で実行される。
  • TemplateInstance はそのTemplateDeclaration を検索する、 を検索し、テンプレート引数に対してセマンティックを実行し、可能なオーバーロードの中から最適なものを推測する。 を検索する。
  • TemplateInstance は、同じ引数を持つ既存のインスタンスを検索し、見つかればそれを使用する。 を検索し、見つかればそれを使用する。
  • そうでない場合、残りのセマンティックがTemplateInstance に対して実行される。

Authors:

ソース dtemplate.d

pure nothrow @nogc @safe inout(Expression) isExpression(inout RootObject o);
これらの関数は dynamic_cast の代わりとなる。 は動作しない。
pure nothrow @nogc @safe bool isError(const RootObject o);
このオブジェクトはエラーか?
pure nothrow @nogc @safe bool arrayObjectIsError(const ref Objects args);
オブジェクトのどれかがエラーか?
pure nothrow @nogc @safe inout(Type) getType(inout RootObject o);
argを型として取得してみる。
Dsymbol getDsymbol(RootObject oarg);
argがDsymbolを表す場合は、そのDsymbolを返す。
Parameters:
RootObject oarg 引数を返す。
Returns:
シンボルであればDsymbolを、そうでなければnullを返す。
bool arrayObjectMatch(ref Objects oa1, ref Objects oa2);
配列にマッチする
class TemplateDeclaration: dmd.dsymbol.ScopeDsymbol;
["ミックスイン" テンプレート Identifier (パラメータ) [制約]. https://dlang.org/spec/template.html https://dlang.org/spec/template-mixin.html
bool isTrivialAliasSeq;
パターンにマッチするtemplate AliasSeq(T...) { alias AliasSeq = T; }
bool isTrivialAlias;
パターンにマッチするtemplate Alias(T) { alias Alias = qualifiers(T); }
bool deprecated_;
このテンプレート宣言は非推奨である
Expression lastConstraint;
最後に評価に失敗した後の制約
Array!Expression lastConstraintNegs;
その負の部分
Objects* lastConstraintTiargs;
のテンプレートインスタンス引数lastConstraint
bool overloadInsert(Dsymbol s);
既存のTemplateDeclaration 'this' を新しいもの 's' でオーバーロードする。
Parameters:
Dsymbol s 挿入されるシンボル

戻り値 成功すればtrueを返す。

const(char)* getConstraintEvalError(ref const(char)* tip);
最後の制約評価からのエラーメッセージを破壊的に取得する。
Parameters:
const(char)* tip すべてのオーバーロードを表示した後に表示するヒント
TemplateInstance findExistingInstance(TemplateInstance tithis, ArgumentList argumentList);
このTemplateDeclarationの新しいインスタンス tithisこの TemplateDeclaration の新しいインスタンスが与えられる、 のインスタンスが既に存在するかどうかを調べる。
Parameters:
TemplateInstance tithis 確認するテンプレートインスタンス
ArgumentList argumentList テンプレート化された関数では、異なる解像度が異なるインスタンスを生成するために必要である。 auto ref 異なる解像度で異なるインスタンスが生成されるからである、 テンプレートのパラメータが同じであっても
Returns:
既存のインスタンスが存在しない場合は、null
TemplateInstance addInstance(TemplateInstance ti);
インスタンスtiをTemplateDeclarationのインスタンステーブルに追加する。 インスタンス化に失敗した場合、後でそれを削除するために使用できるハンドルを返す。
void removeInstance(TemplateInstance ti);
インスタンスのテーブルからTemplateInstanceを削除する。

入力 addInstance() が返すハンドル

TemplateTupleParameter isVariadic();
最後のテンプレート・パラメータがタプルであるかどうかをチェックする、 そうであればそれを返し、そうでなければnull を返す。
Returns:
最後のテンプレート・パラメータがTemplateTupleParameter
const bool isOverloadable();
テンプレートをオーバーロードできる。
bool reliesOnTident(Type t, TemplateParameters* tparams, size_t iStart = 0);
型tの表現が1つ以上のテンプレート・パラメータに依存しているかどうかをチェックする。
Parameters:
Type t テストした型がnullの場合はfalseを返す。
TemplateParameters* tparams テンプレート・パラメータ。
size_t iStart テストされるパラメータを制限するtparamsの開始インデックス。もし 0でない場合,tparams[0..iStart]はテスト対象から除外される。
bool reliesOnTemplateParameters(Type t, TemplateParameter[] tparams);
t型の表現が1つ以上のテンプレート・パラメータに依存しているかどうかをチェックする。
Parameters:
Type t テストされた型がnullの場合、falseを返す。
TemplateParameter[] tparams テンプレート・パラメータ。
abstract class TemplateParameter: dmd.ast_node.ASTNode;
class TemplateTypeParameter: dmd.dtemplate.TemplateParameter;

構文 ident : specType = defaultType

class TemplateThisParameter: dmd.dtemplate.TemplateTypeParameter;

構文 この ident : specType = defaultType を指定する。

class TemplateValueParameter: dmd.dtemplate.TemplateParameter;

構文 valType ident : specValue = defaultValue とする。

class TemplateAliasParameter: dmd.dtemplate.TemplateParameter;

構文 specType ident : specAlias = defaultAlias

class TemplateTupleParameter: dmd.dtemplate.TemplateParameter;

構文 ident ...

class TemplateInstance: dmd.dsymbol.ScopeDsymbol;

与えられた foo! name = foo tiargs = args

Expressions* fargs;
関数テンプレート化された関数では、これらは関数名と引数である。 auto ref パラメーターの解決方法が異なるため、関連性がある。 同じテンプレート引数であっても、異なるテンプレートインスタンスを生成する
final const pure nothrow @nogc @property @safe bool semantictiargsdone();
semanticTiargs()は実行されたか?
final const pure nothrow @nogc @property @safe bool havetempdecl();
2番目のコンストラクタで使用されている場合
final const pure nothrow @nogc @property @safe bool gagged();
インスタンス化がエラー・ギャグ付きで行われた場合
scope this(const ref Loc loc, TemplateDeclaration td, Objects* tiargs);
このコンストラクタは、どの関数 テンプレートをインスタンス化するときだけ呼ばれる。
final void printInstantiationTrace(Classification cl = Classification.error, const(uint) max_shown = global.params.v.errorSupplementCount());
TemplateInstanceのインスタンス化がエラーになった場合、 TemplateInstanceのインスタンス化でエラーが発生した場合は、ネストされたTemplateInstanceのインスタンス化を行う。 を与える。これらは、ネストされたスコープにスレッドされたリストである。
Parameters:
Classification cl このトレースを、エラーまたは非推奨のいずれかを表示するものとして分類する。
const(uint) max_shown 表示されるトレース要素の最大数(-v/-verror-limitで制御される)
final Identifier getIdent();
テンプレート・インスタンスの識別子を簡単に生成する。 これは、identの75%が決して必要とされないからである。
final bool equalsx(TemplateInstance ti);
提案されたテンプレートのインスタンス化と既存のテンプレートのインスタンス化を比較する。 自動参照チェックのため、これは可換ではないことに注意。
Parameters:
TemplateInstance ti 既存のテンプレートのインスタンス化
Returns:
マッチする場合は真
final bool isDiscardable();
Returns:
インスタンスの内部が廃棄可能であればtrueを返す。
この関数のアイデアは、テンプレート化された関数がその同名のメンバと がその同名のメンバと100%置き換えられるかどうかを調べることである。他のすべてのメンバ を破棄することができる(例えば、コンパイラでメモリを解放するため)、 例えば、テンプレートはリージョンアロケータで展開される、 最終結果は独立してコピーバックされ、領域全体が解放される)、 バイナリから完全に除外することもできる。
現在の実装は、一般的に以下のようなコードに影響する:
template foo(args...) {
    some_basic_type_or_string helper() { .... }
    enum foo = helper();
}
これは実装の最も簡単な出発点であったからである。 しかし、後でもっと拡張することもできるし、拡張すべきである。
final bool needsCodegen();
非ルート・モジュールでインスタンス化されていなければ真を返す。 が非指定的インスタンス化の一部である場合に真を返す。

注釈 minstは、意味解析が完了するまで安定化しない、 従って、正確な結果を返すために、意味解析中にこの関数を呼ばないこと。

final bool findTempDecl(Scope* sc, WithScopeSymbol* pwithsym);
テンプレート・インスタンスに対応するテンプレート宣言を見つける。
Returns:
検索に失敗した場合はfalseを返す。

注釈: この関数はエラー発生に対してリエントラントである。 この関数はエラー発生に対してリエントラントである。falseを返した場合 を返した場合、このオブジェクトのメンバは変更されない。 同じエラーを再現する。

final bool updateTempDecl(Scope* sc, Dsymbol s);
sが有効なテンプレートであることを確認し、それを保存する。

入力 sc sはテンプレートの候補シンボルである。以下の可能性がある: テンプレート宣言 funcDeclaration with findTemplateDeclRoot() != NULLである。 候補を含むオーバーロードセット

Returns:
更新が成功したらtrueを返す
static bool semanticTiargs(const ref Loc loc, Scope* sc, Objects* tiargs, int flags, TupleDeclaration atd = null);
テンプレートの引数としてtiargsのセマンティックを実行する。

入力 loc sc テンプレートの引数tiargsの配列 フラグ 1: const変数を初期化子に置き換える 2: パラメータを型に分解しない。 最適化されるatdタプル。見つかった場合、ここでは展開されない で展開されず、AliasAssignセマンティックで展開される。

Returns:
1つ以上の引数にエラーがある場合はfalseを指定する。
final bool semanticTiargs(Scope* sc);
tiargsの要素に対してsemanticを実行する。

入力 sc

Returns:
1つ以上の引数にエラーがある場合はfalseとする。

注釈:この関数はエラー発生に対してリエントラントである。 この関数はエラー発生に対してリエントラントである。falseを返した場合 を返した場合、tiargsのすべての要素は変更されない。

final bool findBestMatch(Scope* sc, ArgumentList argumentList);
このTemplateInstanceに最もマッチするTemplateDeclarationを見つける。
Parameters:
Scope* sc このTemplateInstanceが存在するスコープ
ArgumentList argumentList テンプレート化された関数の場合は関数の引数
Returns:
true にマッチする場合、false
final bool needsTypeInference(Scope* sc, int flag = 0);
テンプレートインスタンスが本当にテンプレート化された関数かどうかを判定する、 テンプレート関数は関数から型を推測する必要がある。 引数から型を推測する必要がある。
findBestMatchのように、可能性のあるテンプレート候補を繰り返し実行する、 ただし、型推論の必要性だけを調べる。
final bool hasNestedArgs(Objects* args, bool isstatic);
TemplateInstanceがTemplateDeclarationのネストされた生成を必要とするかどうかを判断する。 の生成が必要かどうかを判断する。 必要であれば、囲むプロパティを設定し、!= 0 を返す;
final Dsymbols* appendToModuleMember();
特定のモジュールに 'this' を追加する members[].
final void declareParameters(Scope* sc);
テンプレート・インスタンスのパラメータを宣言し、テンプレート・インスタンスの引数で初期化する。 テンプレート・インスタンスの引数で初期化する。
final Identifier genIdent(Objects* args);
このインスタンスには、ネーム・マングリングのために識別子が必要である。 テンプレート宣言名を取り、そのための型シグネチャを追加することで識別子を作成する。 型シグネチャを追加する。
void unSpeculative(Scope* sc, RootObject o);
IsExpressionは指定された型を推測的に評価できる。 シンボルをインスタンス化したとしても、最終的な実行可能ファイルでは通常不要である。 最終的な実行ファイルには不要である。 しかし、それらのシンボルが実際のコードに漏れる場合、コンパイラはそのシンボルを非指定的であることを示す必要がある。 そのシンボルを生成し、最終的な実行ファイルにリンクする。
@safe bool definitelyValueParameter(Expression e);
eがテンプレート値のパラメータとしてのみ有効な場合はtrueを返す。 エイリアスやタプルである可能性がある場合は偽を返す。 (この場合でも、値であることが判明する可能性があることに注意)。
class TemplateMixin: dmd.dtemplate.TemplateInstance;

構文 mixin MixinTemplateName [TemplateArguments]識別子;

struct TemplateInstanceBox;
この構造体は、TemplateInstanceが連想配列のキーになるために必要である。 https://issues.dlang.org/show_bug.cgi?id=15813を修正すれば不要になる。
MATCH matchArg(TemplateParameter tp, Loc instLoc, Scope* sc, Objects* tiargs, size_t i, TemplateParameters* parameters, ref Objects dedtypes, Declaration* psparam);
特定のTemplateParameterにマッチする。

入力 instLoc テンプレートがインスタンス化される場所。 tiargs[] テンプレートインスタンスへの実際の引数 i 番目の引数 parameters[] テンプレートパラメータ dedtypes[] テンプレート・インスタンスへの推論された引数 *psparamは宣言されたシンボルに設定され、dedtypes[i]に初期化される

struct TemplateStats;
テンプレート・インスタンスの統計を収集し、表示する。
static void incInstance(const TemplateDeclaration td, const TemplateInstance ti, bool listInstances);
このインスタンスを追加する
Parameters:
TemplateDeclaration td テンプレート宣言
TemplateInstance ti tdのインスタンス
bool listInstances テンプレートのインスタンスを追跡する
static void incUnique(const TemplateDeclaration td, const TemplateInstance ti);
このユニークなインスタンスを追加する
void printTemplateStats(bool listInstances, ErrorSink eSink);
テンプレートのインスタンス化に関する情報統計を表示する。
Parameters:
bool listInstances テンプレートのインスタンスをリストする
ErrorSink eSink 表示が送信される
struct MATCHpair;
MATCHのペア
MATCH mta;
初期テンプレート引数によってテンプレートパラメータにマッチする
MATCH mfa;
推論されたテンプレート引数によってテンプレートパラメータにマッチする