the template guide geeksforgeeks example espaƱol c++ templates d d2

guide - template c++ geeksforgeeks



Compatibilidad de enlaces entre C++ y D (3)

D fácilmente interactúa con C

D se conecta con C++ con la misma facilidad, pero (y es un gran problema) el C++ debe ser extremadamente trivial. El código no puede utilizar:

  • espacios de nombres
  • plantillas
  • herencia múltiple
  • mezcla virtual con metodos no virtuales
  • ¿Más?

Entiendo completamente la restricción de herencia. El resto sin embargo, se sienten como limitaciones artificiales. Ahora no quiero poder usar std::vector<T> directamente, pero realmente me gustaría poder vincularlo con std::vector<int> como una plantilla externa.

La página de interfaz de C ++ tiene este comentario particularmente deprimente.

Las plantillas D tienen poco en común con las plantillas C ++, y es muy improbable que se pueda encontrar algún método razonable para expresar las plantillas C ++ de una manera compatible con el enlace con D.

Esto significa que C ++ STL y C ++ Boost probablemente nunca serán accesibles desde D.

Es cierto que probablemente nunca necesitaré std::vector mientras codifico en D , pero me encantaría usar QT o boost .

Entonces, ¿cuál es el problema. ¿Por qué es tan difícil expresar clases de C++ no triviales en D? ¿No valdría la pena agregar algunas anotaciones especiales o algo para expresar al menos espacios de nombres?

Actualización : "D tiene soporte de espacio de nombres en las obras" de Walter Bright .


Como Hans Passant menciona en un comentario, el nivel de interoperabilidad que desea entre D y C ++ ni siquiera es compatible entre los diferentes compiladores de C ++. Existe un estándar de C ++ ABI (Interfaz binaria de aplicación) que parece tener algo de soporte, pero no estoy seguro de cuán extenso (los compiladores de Intel, GCC y ARM parecen seguir los ABI). No he tenido la necesidad de usarlo, y no estoy seguro de si Microsoft se adhiere a él para sus compiladores x86 o x64 (me imagino que podría serlo para ia64, ya que ahí es donde comenzó el estándar ABI).

Consulte "Interoperabilidad y compiladores de C ++" por Joe Goodman para obtener algunos detalles sobre el C ++ ABI.

Tal vez se pueda convencer a Walter Bright de que sea compatible con la interoperabilidad de D con las bibliotecas / objetos de C ++ que siguen el estándar ABI (aunque no estoy seguro de dónde podría priorizarlo).


FWIW Qt tiene un enlace desarrollado activamente para D: http://www.dsource.org/projects/qtd

Creo que muchos de los componentes de boost están demasiado vinculados a C ++ para que puedan transportarse de manera significativa a otros idiomas.

El uso de, por ejemplo, std :: vector es posible si dedica tiempo a escribir funciones regulares (por ejemplo, a nivel de espacio de nombres) que reenvíen a las funciones miembro apropiadas. Tedioso, pero asequible (para componentes de alto nivel; probablemente no para std :: vector).

Además, hace poco verifiqué en la biblioteca estándar un arreglo sellado y una implementación de montón binario sellado que utiliza el recuento de referencias, malloc / free y destrucción determinista en lugar de recolección de basura (consulte http://www.dsource.org/projects/phobos/browser/trunk/phobos/std/container.d ). Otros contenedores seguirán. Estos contenedores utilizan tres técnicas específicas (descritas en mi próximo artículo "Contenedores sellados") para lograr la destrucción determinista sin comprometer la seguridad del programa.

Es de esperar que los contenedores sellados eliminen la necesidad de vincularse con los contenedores STL, incluso para aplicaciones ajustadas que no pueden costear la recolección de basura.


Solo por diversión, he estado interactuando con un código C ++.

Probablemente eso no responda a tu pregunta, pero creo que a ti (y a algunas personas de la comunidad D) les pueden interesar algunas notas que he hecho entonces. Aquí va: TechNotes .