如何在C ++中创建条件typedef

时间:2013-07-25 09:42:42

标签: c++ c++11

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

#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?

3 个答案:

答案 0 :(得分:132)

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

#include <type_traits>  //include this

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

请注意,如果您在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!

答案 1 :(得分:34)

使用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

答案 2 :(得分:6)

如果您没有可用的C ++ 11(虽然您计划使用std::mt19937时会出现这种情况),那么您可以使用{在没有C ++ 11支持的情况下实现相同的功能{3}}。这是一个可编辑的例子:

#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个字节。