Frage

Ich habe um vor kurzem mit der D Sprache zu spielen, und ich habe eine kurze Frage zu Vorlagen.

Ich bin Zeichen und Zeichenketten in eine bestehende Zeichenfolge in dem Einfügen von Code und kam mit dieser Funktion auf:

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

Nun, ich habe mehrere Fragen.

  1. Kann ich die Typen für das s2 Argument erlaubt begrenzen (I nur will char, wchar, Dchar usw. und ihren jeweiligen Array-Wert)?

  2. Gibt es eine Möglichkeit um die Vorlage zu definieren, um automatisch vorangestellt wird, ob die Position arg 0 ist? So etwas wie dies (was nicht kompilieren lässt, gibt aber die allgemeine Idee):

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

Danke

War es hilfreich?

Lösung

  1. Ja - entweder Template-Parameter Spezialisierung oder template Constraints (Äquivalent ++ 1x Konzepte C).
  2. static if bedeutet, dass die Bedingung zum Zeitpunkt der Kompilierung berechnet werden kann. Ein Funktionsparameter kann nicht sein, also entweder eine regelmäßige if verwenden oder einen Template-Parameter machen position.

Andere Tipps

1, gibt es tatsächlich zwei Stellen Sie die zulässigen Typen beschränken können.

Die erste ist vor Methodenauswahl. Wenn ein Symbol für mehrere Methoden löst, wird der Compiler versuchen, so viele wie möglich zu beseitigen, bevor es zu versuchen hat und zu entscheiden, welche zu benutzen. Template Zwänge (D2 nur) und Spezialisierung der Arbeit in dieser Phase. Zum Beispiel:

string insert(T)(string s1, T s2, uint position) if(isSomeChar!T) // D2 only

-oder -

string insert(T : dchar)(string s1, T s2, uint position) // D1 or D2

Die andere ist nach Methodenauswahl. Dies ist, wo hat der Compiler bereits beschlossen, diese spezifische Methode zu verwenden. Sie können dies mit statischen behauptet. Beachten Sie, dass dies nicht den Compiler verursacht zu gehen „ooh, Ich sollte versuchen, für eine andere Überlast suchen“; es wird einfach aufgeben.

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

Eine andere Sache: soweit ich weiß, Sie ** nicht * einfach verketten wchars und dchars in einen String (das ein Array von Zeichen). Sie werden zuerst die Zeichen in einen String codieren müssen. encode im std.utf Modul sollte es tun.

In Bezug auf 2, können Sie nicht nur eine normale if-Anweisung?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top