• 분류 전체보기 (9)
    • Study (7)
      • CPP (4)
      • DataStructure (2)
      • Algorithm (0)
      • 기타 개발 팁 (1)
    • Diary (1)

블로그 메뉴

  • 홈
  • CPP
  • DataSturcture
  • Algorithm

공지사항

인기 글

태그

  • CS
  • 프로그래밍 #windows #배치파일 #윈도우 #windows #batch #command
  • C++
  • IT
  • CPP
  • Queue
  • 컴퓨터

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
fredhur

fredhur's Tech Blog

Study/CPP

Enum class to type ( int2Type 의 응용)

2022. 11. 2. 23:43

개요

integral_constant 는 int2type 이라는 C++ 11 부터 자주 쓰는 테크닉이 C++17 부터 정식 반영된 케이스라고 한다.

페이스북의 모든 소프트웨어 구조를 설계했다고 알려진 개발자가 이전에 integer 를 타입화 시켜 사용하던 테크닉이 정식에 반영된 케이스라고 한다. 나는 이것을 살짝 응용해서, enum class 를 타입화 시키는 방법에 대해서 소개 하려고 한다.

enum class

enum class는 modern c++ ( c++11 ~ ) 에서 부터 적용된 개념으로 아래와 같이 두가지 특징을 가지고 있다.

  • enum 에 별도의 scope 를 소유할 수 있게 한다. (아래 코드 참조)
#include <iostream>

enum class TrafficLight
{
    Red,
    Blue,
    Green
};
enum class Color
{
    Red,
    Blue,
    Green
};
int main()
{
    Color color = Color::Red;
    TrafficLight trafficLight = TrafficLight::Red;
}
  • 기존에 사용하던 enum 과는 달리 integer로의 자동형변환을 방지한다. (아래 코드 참조)
#include <cstdio>
enum class Color
{
    Red,
    Blue,
    Green
};

int main()
{
    int color = Color::Red; // compile error !!

}

int2Type

현재는 integral_constant 라는 이름으로 표준화됐다. 이 기능은 function dispatch 라고 하여 같은 이름의 함수를 인자에 따라서 다르게 call 하는 기법에 사용된다.

// If there is no int2Type, foo(0) and foo(1) cannot be seperated.
int foo(int n)
{
    if(n==0)
    {
        return 0;
    }

    else if(n==1)
    {
        return 1;
    }
    return -1;
}

int main()
{
    foo(0);
    foo(1);
}
// What if we use int2Type?

#include <cstdio>
template <int N>
struct int2Type
{
    enum
    {
        value = N
    };
};

int foo(int)
{
    return -1;
}
int foo(int2Type<0>)
{
    return int2Type<0>::value;
}
int foo(int2Type<1>)
{
    return int2Type<1>::value;
}

int main()
{

    const auto t1 = foo(int2Type<0>::value);
    const auto t2 = foo(int2Type<0>());
    const auto t3 = foo(int2Type<1>());
    printf("t1 : %d\n", t1);
    printf("t2 : %d\n", t2);
    printf("t3 : %d\n", t3);

    // Result

    // t1 : -1
    // t2 : 0
    // t3 : 1

    return 0;
}

위와 같이 int2Type<0> 같이 사용해야하는 약간의 번거로움이 있지만, 숫자 0, 1, 2 가 마치 타입처럼 바뀌어서 내가 사용하고 싶은 함수를 같은 이름에 인자 갯수가 같아도 함수이름을 같게 사용할 수 있다는 멋진 기능을 가지고 있다. 일종의 다형성을 readability 가 좋게 구현할 수 있는 방법이다.

enum class to type

위에 말한 두가지 개념을 합치면 enum class 를 타입화 할 수 있다. 가독성을 위하여 enum 을 타입화 하고 해당 enum 에 대한 각기 다른 함수를 호출 할 수 있도록 구현을 하면 어떨까 ? 아래와 같은 코드로 이것을 구현할 수 있다.

#include <iostream>
using namespace std;

enum class TrafficLight
{
    Red,
    Blue,
    Green 
};

template <TrafficLight N> struct Enum2Type 
{
    static constexpr TrafficLight value = N;
};

void TurnTrafficLight(Enum2Type<TrafficLight::Red> )
{
    cout << "Turn Red" << endl;   
}
void TurnTrafficLight(Enum2Type<TrafficLight::Blue> )
{
    cout << "Turn Blue" << endl;   
}
void TurnTrafficLight(Enum2Type<TrafficLight::Green> )
{
    cout << "Turn Green" << endl;   
}

int main()
{

    constexpr TrafficLight light = TrafficLight::Blue;

    if constexpr(light == TrafficLight::Red)
    {
        TurnTrafficLight(Enum2Type<TrafficLight::Red>());
    }
    else if(light == TrafficLight::Green)
    {
        TurnTrafficLight(Enum2Type<TrafficLight::Blue>());
    }
    else 
    {
        TurnTrafficLight(Enum2Type<TrafficLight::Green>());
    }
    return 0;
}

위 와 같이 빨강, 파랑 , 초록에 따라서 내가 부르고 싶은 함수가 다를 경우 위와 같이 구현을 할 수 있다.

마치며

위 기능은 앞에서 간단히 설명하였듯 is_pointer, is_array 등의 구현을 이해하는데의 가장 기초적인 개념이다. c++ 의 문법을 이용하여
아주 예쁘게 기능을 구현한 아주 좋은 예시라고 할 수 있다. enum class 를 타입화 하는 아이디어를 여기에 적은 이유는 검색을 해봐도
enum 을 타입화 시키는 방법에 대한 이야기도 없었고 또 그렇게 어려운 내용이 아니기에 이곳에 남기게 됐다.
나는 해당 기능을 enum 타입별 거의 같은 역할을 하는 함수를 call 할때 쓰고 있다. 함수 이름 짓기가 너무 귀찮고, 함수 이름에서 굳이 이걸 구분해야 하나 싶어서 이다. 은근히 멋진 테크닉이라, 많이 알았으면 좋겠다.

참조 코드

  • 8bitscoding Blog
  • cppreference
저작자표시 (새창열림)

'Study > CPP' 카테고리의 다른 글

class template deduction guide  (0) 2024.03.06
protected destructor  (0) 2024.02.25
EnumClassToType  (0) 2022.09.12
    'Study/CPP' 카테고리의 다른 글
    • class template deduction guide
    • protected destructor
    • EnumClassToType
    fredhur
    fredhur

    티스토리툴바