2009-10-23 18 views
6

He estado jugando recientemente con el lenguaje D y tengo una pregunta rápida sobre las plantillas.Algunas preguntas de la plantilla D

estoy insertar caracteres y cadenas en una cadena existente en el código y se acercó con esta función:

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

Ahora, tengo varias preguntas.

  1. puedo limitar los tipos permitidos para el argumento s2 (sólo quiero char, wchar, dchar, etc., y sus respectivos valores de la matriz)?

  2. ¿Hay alguna manera de definir la plantilla para que se sepa automáticamente si la posición arg es 0? Algo como esto (que no se compila, pero da la idea general):

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

Gracias

+0

StackOverflow está pensando que su segundo bloque de código es un nuevo párrafo para el punto 2. –

Respuesta

4
  1. Sí - utilizando template parameter specialization o template constraints (equivalente a C++ 1x conceptos).
  2. static if implica que la condición se puede calcular en tiempo de compilación. Un parámetro de función no puede ser, por lo tanto, use un if regular o haga que position sea un parámetro de plantilla.
+0

¿Cómo hacer para 'position' un parámetro de plantilla? Algo como el siguiente? inserto de cadena (T, uint Posición) (...) { estático if (Posición == 0) ... else ... } – GKelly

+0

Básicamente, estoy buscando una forma de evitar la mayor cantidad de decisiones de tiempo de ejecución posible aquí, así que estoy tratando de ver si puedo evitar un 'normal' si. Para ser sincero, solo estoy explorando el idioma, normalmente sería feliz con el no estático si, pero solo estoy explorando lo que es posible. – GKelly

+0

@ primera pregunta: Sí. –

0

Como a 2, no puede usted sólo tiene que utilizar una normal de declaración si?

1

Para 1, en realidad hay dos lugares donde puede restringir los tipos permitidos.

El primero es antes de la elección del método. Si un símbolo se resuelve en múltiples métodos, el compilador tratará de eliminar tantos como pueda antes de que tenga que intentar y decidir cuál usar. Restricciones de plantilla (solo D2) y trabajo de especialización en esta fase. Por ejemplo:

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

-o-

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

El otro es después de selección del método. Aquí es donde el compilador ya ha decidido usar este método específico. Puedes hacer esto con afirmaciones estáticas. Tenga en cuenta que esto no hace que el compilador responda "ooh, ¡debería intentar buscar una sobrecarga diferente!"; simplemente se dará por vencido.

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

Otra cosa: por lo que yo sé, que no puede ** * simplemente concatenar wchars y dchars en una cadena (que es una serie de caracteres). Primero deberá codificar el personaje en una cadena. encode en el módulo std.utf debería hacer el truco.

Cuestiones relacionadas