반응형
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::conditional
C ++ 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
반응형
'IT story' 카테고리의 다른 글
이메일 서명의 base64 인코딩 이미지 (0) | 2020.09.11 |
---|---|
mongodb 컬렉션에서 최신 기록 가져 오기 (0) | 2020.09.11 |
자바 스크립트에서 DOM 요소에 대한 HTML을 얻는 방법 (0) | 2020.09.11 |
LINQ-값을 목록으로 사용하여 목록을 사전으로 변환 (0) | 2020.09.11 |
긴 텍스트를 사용한 Rails 3 마이그레이션 (0) | 2020.09.11 |