如何在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个字节。