2010-05-09 10 views
5

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.

+3

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. –

+0

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

+0

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

Respuesta

1

boost::variant tiene una implementación de has_nothrow_move para su propio uso interno; podría usar eso, aunque no es tan confiable como lo sería una implementación adecuada del compilador. La fuente para esto es here - No sé qué tan confiable es, así que YMMV.

Aparte de eso, puede probar las macros de la versión del compilador (__GNUC__ and __GNUC_MINOR__) para determinar la presencia y anularla si no está presente. Desafortunadamente, parece que has_nothrow_move_constructor aún no es compatible con ninguna versión de G ++, por lo que tendrás que esperar un poco antes de que conozcas la versión correcta para usar.

Cuestiones relacionadas