Estoy tratando de hacer algo como esto:
#include <iostream>
#include <random>
typedef int Integer;
#if sizeof(Integer) <= 4
typedef std::mt19937 Engine;
#else
typedef std::mt19937_64 Engine;
#endif
int main()
{
std::cout << sizeof(Integer) << std::endl;
return 0;
}
pero me sale este error:
error: missing binary operator before token "("
¿Cómo puedo hacer correctamente el typedef condicional?
sizeof
otras construcciones de C ++. Es sin duda no sabe nada de las cosas que ha creado usted mismo contypedef
, como que aun no se ha analizado todavía.enable_if
oconditional
para definir condicionalmente typedefs, pero no puede usar preprocesador para eso.sizeof
que no puede funcionar en condiciones de preprocesador es porque el lenguaje está definido de esa manera, no por cómo funciona una implementación.Respuestas:
Utilice la
std::conditional
metafunción de C ++ 11.Tenga en cuenta que si el tipo que utiliza
sizeof
es un parámetro de plantilla, por ejemploT
, debe utilizarlotypename
como:O hacer
Engine
depender deT
como:Eso es flexible , porque ahora puedes usarlo como:
fuente
sizeof(int) <= 4
tal vez no sea una forma muy portátil, ya que en una máquina Windows de 64 bits, el compilador GCC (MinGW) x64 dasizeof(int) = sizeof(long) = 4
. Una mejor forma seríasizeof(void*) <= 4
.Engine<void*> engine4;
? ;-)std::conditional<sizeof(void*) <= 4, std::mt19937, std::mt19937_64>
en el primer fragmento de código.Engine<void*>
? : Pint
:)Usando
std::conditional
puedes hacerlo así:Si quieres hacer una
typedef
, también puedes hacerlo.fuente
typename
estoSi no tiene C ++ 11 disponible (aunque parece que lo tiene si planea usarlo
std::mt19937
), entonces puede implementar lo mismo sin el soporte de C ++ 11 usando Boost Metaprogramming Library (MPL) . Aquí hay un ejemplo compilable:Esto imprime el nombre mutilado de
foo
en mi sistema, ya queint
aquí hay 4 bytes.fuente
if_c
lugar? Sería imprescindible más fácil de escribir (y entender):mpl::if_c<sizeof(int)<=4, foo, bar>::type
. ¿No es así?mpl::if_c
. Actualicé el ejemplo para usar ese enfoque en su lugar.