me había olvidado que ese tipo de variadics incluso existido en D. No creo que TDPL incluso les menciona. Creo que lo que hace un total de 4 tipos diferentes de variadics en D.
C variadics
extern(C) void func(string format, ...) {...}
D variadics con TypeInfo
void func(string format, ...) {...}
variadics homogéneos utilizando matrices
void func(string format, string[] args...) {...}
variadics heterogéneos utilizando la plantilla variadics
void func(T...)(string format, args) {...}
Creo que TDPL realidad sólo habla de # 3 y # 4, y los que son todo lo que normalmente uso, por lo que tendría que ir a cavar a averiguar cómo pasar argumentos usando # 2. Espero que sea similar a cómo lo haces en C con el n. ° 1, pero no sé.
Sin embargo, es fácil con # 3 y # 4. En ambos casos, simplemente pase args
a la función que desee pasar. Y ambos permiten indexar y dividir (por ejemplo, args[1]
y args[1 .. $]
) y tener una propiedad length
. Por lo tanto, son fáciles de usar, y en su mayor parte, son la mejor manera de hacerlo. Las únicas excepciones que puedo pensar son si llamas a una función C existente (en cuyo caso, usas # 1) o si necesitas plantillas heterogéneas y no puedes permitirte el aumento en el tamaño binario que crean las plantillas (en las cuales caso de que use el n. ° 2), lo que realmente debería ser solo un problema en entornos integrados. En general, # 3 y # 4 y simplemente mejores soluciones.
Gracias a todos, resulta que las plantillas resolvieron el problema de manera muy limpia y elegante. Bonificación adicional: no causa ninguna asignación de memoria, por lo que se puede invocar desde destructores (es una función de un módulo de registro). –