如何在C ++中创build一个条件的typedef

我正在尝试做这样的事情:

#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; } 

但我得到这个错误:

 error: missing binary operator before token "(" 

我怎样才能正确地使条件typedef?

使用C ++ 11中的std::conditional元函数。

 #include <type_traits> //include this typedef std::conditional<sizeof(int) <= 4, std::mt19937, std::mt19937_64>::type Engine; 

请注意,如果您在sizeof使用的sizeof是模板参数(如T ,则必须将typename用作:

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

或者使Engine依赖于T

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

这是灵活的 ,因为现在你可以使用它:

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

使用std::conditional你可以这样做:

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

如果你想做一个typedef ,你也可以这样做。

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

如果你没有可用的C ++ 11(尽pipe如果你打算使用std::mt19937 ,你std::mt19937 ),那么你可以在没有C ++ 11支持的情况下使用Boost Metaprogramming Library(MPL ) 。 这是一个可编辑的例子:

 #include <boost/mpl/if.hpp> #include <iostream> #include <typeinfo> namespace mpl = boost::mpl; struct foo { }; struct bar { }; int main() { typedef mpl::if_c<sizeof(int) <= 4, foo, bar>::type Engine; Engine a; std::cout << typeid(a).name() << std::endl; } 

这将在我的系统上打印foo重名,因为int在这里是4个字节。