87 votes

Comment faire un typedef conditionnel en C++

Je suis en train de faire quelque chose comme ceci :

mais j’obtiens cette erreur :

Comment faire correctement le typedef conditionnels ?

135voto

Nawaz Points 148870

Utiliser l' std::conditional méta-fonction de C++11.

#include <type_traits>  //include this

typedef std::conditional<sizeof(int) <= 4,
                         std::mt19937,
                         std::mt19937_64>::type Engine;

Notez que si le type que vous utilisez, en sizeof est un paramètre du modèle, dire T, alors vous devez utiliser typename comme:

typedef typename std::conditional<sizeof(T) <= 4, // T is template parameter
                                  std::mt19937,
                                  std::mt19937_64>::type Engine;

Ou faire Engine dépendent T comme:

template<typename T>
using Engine = typename std::conditional<sizeof(T) <= 4, 
                                         std::mt19937,
                                         std::mt19937_64>::type;

Qui est flexible, parce que maintenant vous pouvez l'utiliser comme:

Engine<int>  engine1;
Engine<long> engine2;
Engine<T>    engine3; // where T could be template parameter!

34voto

Rapptz Points 10135

À l’aide de `` vous pouvez le faire comme suit :

Si vous voulez faire un `` , vous pouvez le faire aussi.

6voto

Jason R Points 2399

Si vous n’avez pas C ++11 disponible (bien qu’il semble vous faire si vous avez l’intention d’utiliser `` ), puis vous pouvez appliquer la même chose sans C ++11 support en utilisant la Métaprogrammation de Boost Library (MPL). Voici un exemple compilable :

Ceci affiche le nom tronqué de sur mon système, comme un ici de 4 octets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X