2009-10-23 10 views
6

最近私はD言語で遊んでいましたが、テンプレートについては簡単に質問があります。私は、コード内の既存の文字列に文字と文字列を挿入し、この機能を思い付いたんだいくつかのDテンプレートに関する質問

:今

string insert(T)(string s1, T s2, uint position) { 
    return s1[0 .. position] ~ s2 ~ s1[position .. $]; 
} 

、私はいくつかの質問を持っています。

  1. s2引数に許可される型を制限できます(char、wchar、dcharなどおよびそれぞれの配列値のみが必要です)。

  2. 位置argが0の場合に自動的に追加するテンプレートを定義する方法はありますか? 2に関しては

    string insert(T)(string s1, T s2, uint position) { 
        static if (position == 0) 
        return "" ~ s2 ~ s1; 
        else 
        return s1[0 .. position] ~ s2 ~ s1[position .. $]; 
    } 
    

おかげ

+0

StackOverflowは、2番目のコードブロックがポイント2の新しい段落であると考えています。 –

答えて

4
  1. はい - template parameter specializationまたはtemplate constraints(C++ 1xの概念に相当)のいずれかを使用します。
  2. static ifは、コンパイル時に条件を計算できることを意味します。関数パラメータはできません。したがって、通常のifを使用するか、positionをテンプレートパラメータにします。
+0

「位置」をテンプレートパラメータにするにはどうしたらいいですか?次のような何か? 文字列挿入(T、uint位置)(...){ static if(Position == 0)... else ... } – GKelly

+0

本質的に、ここでできるだけ多くの実行時の決定を避ける方法を探しているので、もし私が '普通の'ものを避けることができるかどうかを調べようとしています。正直言って、私は言語を勉強しているだけで、通常は静的ではないほど満足していますが、可能なものを探っています。 – GKelly

+0

@最初の質問:はい。 –

0

、文の場合は、普通に使用することはできません:(コンパイルが、一般的なアイデアを提供しません)このような何か?

1

1の場合、実際には2つの場所で許容タイプを制限できます。

最初はの前にメソッドの選択です。シンボルが複数のメソッドに解決された場合、コンパイラは、どれを使用するかを試して判断する前にできるだけ多くのシンボルを削除しようとします。このフェーズでは、テンプレート制約(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 

他方は方法の選択です。これは、コンパイラがこの特定のメソッドを使用することを既に決めたところです。静的なアサートでこれを行うことができます。これはコンパイラに "ooh;を渡すことはありません。別のオーバーロードを探してみるべきです!";それは単に放棄されます。

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); 
    } 
    ... 
} 

もうひとつ:私の知る限り、あなたは** *簡単に(文字の配列である)文字列にwcharsとdcharsを連結することはできません。最初に文字を文字列にエンコードする必要があります。 std.utfモジュールのencodeがこのトリックを行う必要があります。

関連する問題