Supongamos que tengo la siguiente plantilla de clase:tamaño de una estructura que contiene 1 Puntero
template<typename T>
struct Wrapper {
T* t_;
static void check() {
static_assert(sizeof(Wrapper<T> == sizeof(T*), "Illegal assumption");
}
};
miré en el estándar C99 una en el estándar de C++ 03 y no puede encontrar una garantía para mi suposición expresa en el static_assert
. Lo intenté en Visual C++ 2008 y 2010 (32 bits) y gcc en Linux (64 bits) usando varias opciones del compilador y encontré mi suposición confirmada.
Mi pregunta es:
- ¿Es mi suposición razonable para Visual C++ 2008/2010/11 (ventanas)?
- Para gcc 4. * (linux)?
- ¿Para cualquier combinación de indicadores del compilador?
- ¿Conoce algún compilador/plataforma donde esta suposición no sea cierta?
Supongo que un compilador podría agregar algo de relleno a la estructura, p. con fines de depuración. ¿Pero hay un compilador que realmente hace eso?
Editar: Así como se pide aquí es lo que quiero lograr:
tengo la función miembro con la siguiente firma:
Someclass* OtherClass::fn();
Quiero cambiar la firma de esta manera:
Wrapper<Someclass> OtherClass::fn();
Este envoltorio actúa como un puntero inteligente, es decir, se preocupa por la duración del puntero, por lo que lo libera cuando se sale del alcance. Como se llama a la función a través de un límite dll, quiero asegurarme de que el valor devuelto (que ahora es un tipo concreto, no solo un puntero tonto) sea en todas las circunstancias (es decir, configuración del compilador, etc.) del mismo tamaño que el puntero sería. El plan/esperanza es admitir todas las combinaciones de versiones de depuración/aplicación/dll.
Como podría preguntar: no, no puedo usar boost :: shared_ptr <>, std :: shared_ptr <>, std :: unique_ptr <> y similares, ya que no queremos exponer el impulso al usuario dll y aún no somos compatibles con C++ 11.
¿Consideró las funciones virtuales/herencia? – PlasmaHH
Entonces ... ¿quieres que probemos el código en todos esos compiladores y plataformas? –
No, probablemente quiera saber si alguien ya hizo algo similar y/o si esto está implícito en algún otro lugar en la documentación estándar o del compilador. – Tibor