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?

sizeofotras 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_ifoconditionalpara definir condicionalmente typedefs, pero no puede usar preprocesador para eso.sizeofque 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::conditionalmetafunción de C ++ 11.Tenga en cuenta que si el tipo que utiliza
sizeofes un parámetro de plantilla, por ejemploT, debe utilizarlotypenamecomo:O hacer
Enginedepender deTcomo:Eso es flexible , porque ahora puedes usarlo como:
fuente
sizeof(int) <= 4tal 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::conditionalpuedes hacerlo así:Si quieres hacer una
typedef, también puedes hacerlo.fuente
typenameestoSi 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
fooen mi sistema, ya queintaquí hay 4 bytes.fuente
if_clugar? 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.