質問
最近、D言語で遊んでいますが、テンプレートについて簡単な質問があります。
コード内の既存の文字列に文字と文字列を挿入し、この関数を思い付きました:
string insert(T)(string s1, T s2, uint position) {
return s1[0 .. position] ~ s2 ~ s1[position .. $];
}
今、いくつか質問があります。
-
s2引数に許可される型を制限できますか(char、wchar、dcharなど、およびそれぞれの配列値のみが必要です)。
-
位置argが0の場合、自動的に先頭に追加するテンプレートを定義する方法はありますか?次のようなもの(コンパイルはしませんが、一般的な考え方を示します):
string insert(T)(string s1, T s2, uint position) { static if (position == 0) return "" ~ s2 ~ s1; else return s1[0 .. position] ~ s2 ~ s1[position .. $]; }
ありがとう
解決
- はい-テンプレートパラメータの特殊化またはテンプレートの制約(C ++ 1xの概念に相当)。
-
static if
は、コンパイル時に条件を計算できることを意味します。関数パラメーターは使用できないため、通常のif
を使用するか、position
をテンプレートパラメーターにします。
他のヒント
1の場合、実際には許容可能なタイプを制限できる2つの場所があります。
1つ目は、メソッド選択の前です。シンボルが複数のメソッドに解決される場合、コンパイラは使用するシンボルを決定する前に、できるだけ多くのメソッドを削除しようとします。テンプレートの制約(D2のみ)と特殊化は、このフェーズで機能します。例:
string insert(T)(string s1, T s2, uint position) if(isSomeChar!T) // D2 only
-または-
string insert(T : dchar)(string s1, T s2, uint position) // D1 or D2
もう1つは、メソッド選択の後です。これは、コンパイラがこの特定の方法を使用することを既に決定している場所です。これは、静的アサートで実行できます。これにより、コンパイラーが" ooh;別のオーバーロードを探してみてください!&quot ;;単にあきらめます。
string insert(T)(string s1, T s2, uint position)
{
static if( !isSomeChar!(T) )
{
pragma(msg, "Error: insert(T): T must be a character type.");
static assert(false);
}
...
}
もう一つ:私が知っている限り、あなたは単純にwcharとdcharを文字列(charの配列)に連結することはできません。最初に、文字を文字列にエンコードする必要があります。 std.utf
モジュールの encode
がトリックを行うはずです。
2に関しては、通常のifステートメントを使用することはできませんか?
所属していません StackOverflow