C++ 컴파일 시 조건에 의해 변수 선언 타입을 변경하기

컴파일 시에 정해진 조건 C의 bool 값에 의해 타입 A 혹은 B를 선택하고 이 타입의 변수를 선언하고 싶은 경우 의사 코드는 아래와 같다.

if (C)
{
  A x;
}
else
{
  B x;
}

이것을 구현하기 위해 std::conditional을 사용하여

typename std::conditional<C, A, B>::type x

로 한다.

이용 예

난수 생성 엔진으로 32비트판의 std::mt19937와 64비트판의 std::mt19937_64이 준비 되어 있다.
템플릿에서 uint32_t가 지정되거나 uint64_t를 지정하는 것에 의해 이것들을 같은 변수 이름으로 선언하고 싶다.
이런 때 std::is_same을 사용하여

typename std::conditional<std::is_same<INT, uint32_t>::value, std::mt19937, std::mt19937_64>::type m;

로 쓸 수 있다. typename은 컴파일러에게 이것이 타입이라고 알려준다.

아래처럼 랩핑해서 사용할 수 있다.

test.cpp

#include <iostream>
#include <random>

template <class INT>
struct Hoge {
  typename std::conditional<std::is_same<INT, uint32_t>::value, std::mt19937, std::mt19937_64>::type m;
  INT operator()() {
    return m();
  }
};

int main() {
  Hoge<uint32_t> h32; // 32비트 난수
  Hoge<uint64_t> h64; // 64비트 난수 
  for (int i = 0; i < 10; i++) {
    std::cout << h32() << " " << h64() << std::endl;
  }
}
$ g++ test.cpp
$ ./a.out
3499211612 14514284786278117030
581869302 4620546740167642908
3890346734 13109570281517897720
3586334585 17462938647148434322
545404204 355488278567739596
4161255391 7469126240319926998
3922919429 4635995468481642529
949333985 418970542659199878
2715962298 9604170989252516556
1323567403 6358044926049913402



출처: https://qiita.com/kaityo256/items/15932998ee78c1577725


이 글은 2020-01-30에 작성되었습니다.