IT story

C ++에서 조건부 typedef를 만드는 방법

hot-time 2020. 9. 11. 19:40
반응형

C ++에서 조건부 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를 올바르게 만들려면 어떻게해야합니까?


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!

사용 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

If you don't have C++11 available (although it appears you do if you're planning to use std::mt19937), then you can implement the same thing without C++11 support using the Boost Metaprogramming Library (MPL). Here is a compilable example:

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

This prints the mangled name of foo on my system, as an int is 4 bytes here.

참고URL : https://stackoverflow.com/questions/17854407/how-to-make-a-conditional-typedef-in-c

반응형