2011-02-14 20 views
8

¿Cómo comprobar si el tipo de C++ es copiable trivialmente? Tengo una clase, que utiliza las funciones memcpy y memcmp con la plantilla especificada tipo T y me gustaría disparar afirmar para los tipos, que no son seguros para copiar con memcpy. ¿Hay alguna manera de hacer eso (con el estándar existente)?C++ is_trivially_copyable check

+2

Puede usar el rasgo de tipo 'is_pod'. ¿Cuál es su definición de "seguro para copiar con' memcpy' "? Si un objeto tiene un miembro de datos de puntero que apunta a un objeto propio asignado dinámicamente, ¿es seguro "copiar con' memcpy' "? –

+0

@James: la definición es, constructor de copia trivial, es decir, el tipo no tiene un constructor de copia definido por el usuario, ni ninguna clase base o miembro de datos con tal. – Puppy

+1

La definición del estándar "Una clase trivially copyable es una clase que: - no tiene constructores de copia no triviales (12.8), - no tiene operadores de asignación de copia no triviales (13.5.3, 12.8), - tiene destructor trivial (12.4) ". – axe

Respuesta

8

No, no es posible en C++ 98/C++ 03. Cosas como esta son las razones por las que <type_traits> se agregó a C++ 0x. Algunas de las características de <type_traits> se pueden implementar en C++ 03, a menudo utilizando el principio SFINAE, pero varias, incluida std::is_trivially_copyable<T>, simplemente requerirán soporte de compilador incorporado.

+0

Sí, esa también fue mi impresión. Gracias. – axe

6

Existen características de tipo disponibles para esto en boost.

Sin embargo, está perdiendo el tiempo, recordar que un tipo no va a ser más rápido que lo que su optimizador producirá con un constructor de copia si el tipo es copiable trivialmente. Solo usa el constructor de copia.

+0

Buen punto. (más caracteres) – aschepler

+0

¿Qué rasgos de tipo? is_pod no es exactamente lo que estoy buscando, ya que Maxim señaló que es casi lo mismo. – axe

+0

_Sin embargo, está desperdiciando su tiempo, recordar que un tipo no va a ser más rápido que lo que su optimizador producirá con un constructor de copia si el tipo es trivialmente copiable. Simplemente use el constructor de copia. No es para el rendimiento, simplemente no quiero que mi clase trabaje para tipos con un constructor de copia no trivial. Podría especializarlo para todos los tipos integrales, sin embargo, entonces no funcionará para POD. – axe