92

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

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

4

3 回答 3

143

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

#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!
于 2013-07-25T09:44:42.160 回答
35

使用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
于 2013-07-25T09:45:04.817 回答
5

如果您没有可用的 C++11(尽管如果您打算使用 似乎您会这样做),那么您可以使用Boost Metaprogramming Library (MPL)std::mt19937在不支持 C++11 的情况下实现相同的功能。这是一个可编译的示例:

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

于 2013-07-25T12:35:25.597 回答