GCC hasta 4.5 no tiene plantilla de rasgo de tipo estándar C++ 0x has_nothrow_move_constructor
. Podría usarlo en mi paquete para la optimización, pero no quiero descartar uno de los compiladores comunes y no quiero sobrecargar la configuración con símbolos como HAVE_STD_HAS_NOTHROW_MOVE_CONSTRUCTOR
. ¿Es de alguna manera posible utilizar esa plantilla si está presente y simplemente recurrir a la copia si no está presente sin usando cualquier símbolo de configuración predefinido? Tampoco quiero depender de Boost, ya que mi biblioteca es pequeña y no necesita Boost por otros motivos.Detectar presencia de plantilla en tiempo de compilación
En pseudocódigo, necesito algo como:
template <typename type>
struct has_nothrow_move_constructor_robust
: public integral_constant <bool,
/* if possible */ has_nothrow_move_constructor <type>::value
/* otherwise */ false>
{ };
Desde constructores se mueven son sólo para C++ 0x todos modos, no me importa usando C++ 0x otra cuenta para la definición anterior, si al todo posible.
La mayor parte de Boost se implementa en archivos de encabezado, no en archivos de objeto. Entonces, si te apegas a esos, no pagas una multa por cosas que no usas, ni por la mayoría de las cosas que usas, para el caso. –
Es más tener una dependencia (incluso si casi todos usan Boost de todos modos). Tal vez podría arrancar la parte relevante de Boost, pero dado que mi biblioteca es como 3 encabezados de todos modos ... – doublep
Parece un tanto difícil verificar si existe un tipo. Pero entonces, si no hay un constructor de movimientos, ¿no C++ 0x generalmente volvería a copiar automáticamente? O, si la parte de la técnica no importa, ¿no es un poco difícil imaginar una clase en la que la copia sea más segura que la mudanza (si la última no está marcada como nothrow)? – UncleBens