http://dlang.org/template.htmlの Argument Deduction セクションで説明されているように、テンプレート引数の型を推測する場合:
- パラメーターの型の特殊化がない場合、パラメーターの型はテンプレート引数に設定されます。
- 型の特殊化が型パラメーターに依存している場合、そのパラメーターの型は型引数の対応する部分に設定されます。
- すべての型引数を調べた後、型が割り当てられていない型パラメーターが残っている場合は、TemplateArgumentList の同じ位置にあるテンプレート引数に対応する型が割り当てられます。
- 上記の規則を適用しても、各テンプレート パラメーターの型が正確に 1 つにならない場合は、エラーになります。
そして、あなたのケースに対応する例は次のとおりです。
template TBar(T : T*) { }
alias TBar!(char*) Foo3; // (2) T is deduced to be char
したがって、最初の例で見ているのは、予想される動作です。T
は両側にあるため、T
最終的にテンプレート引数が になるように評価されT*
ます。したがって、テンプレート引数はint*
であるため、T*
になりint*
、最終的に になりT
ますint
。あなたが持っているものは非常に似ていstd.traits.pointerTarget
ます:
/**
Returns the target type of a pointer.
*/
template pointerTarget(T : T*)
{
alias T pointerTarget;
}
2 番目の例は、そのテンプレートがT
暗黙的に に変換可能であることを要求しているため、コンパイルされint*
ます。また、暗黙的にそれ自体に変換できるため、テンプレート引数としてint*
渡すと機能します。int*
問題を引き起こしているT
のは、式の右側が左側に依存しているため、 が両側にある場合です。
さて、ここで実際にテストしようとしているのは、テンプレート引数がポインターであることだと思いますか? その場合は、次を使用する必要がありますstd.traits.isPointer
。
struct S(T)
if(isPointer!T)
{
T t;
}