C++에 1대1 대응 컨테이너가 있나요?

enum class : int Big {
A,
B,
C
};

enum class : int Small {
c,
b,
a
};

이렇게 2 class가 있을때 A-a, B-b, C-c 매핑해줄 수 있는 컨테이너가 있나요?
unordered_map이나 ordered_map은 key -> value만 변환시킬 수 있을꺼같은데 이거는 한쪽방향으로만 될꺼같아서요.
역으로 매핑이 돼서 양방향으로 매핑할 수 있는 방법이 있을까요?

안되면 그냥 switch case로 하나하나 해주면 되기는 하는데 양방향으로 변환 시켜줄 수 있는 방법이 있는지 궁금해서 질문 올립니다.

그냥 int로 캐스팅해서 변환하면 안되나요?

그냥 int로 변한다 하더라도 위의 case를 보면 A는 0인데 a=2이여서 매핑하는 과정이 필요 해야할것같아서요

C++ std에는 없습니다.
boost.bimap 을 참고하는게 좋을 것 같습니다.

ㅠㅠ 감사합니다.
그냥 저의 경우에는 switch case써야겠네요 ㅠㅠ.
bimap은 천천히 배워보도록 하겠습니다.

이런걸 원하신다는거겠죠?

case:

enum class big : int
{
	A,
	B,
	C,
};

enum class small : int
{
	c,
	b,
	a,
};

solution:

#define gen_link( T1, T2, ... )\
template< auto A, auto a, auto...rest >\
constexpr auto _T2##_of( T1 v ){\
	if( A == v ) return  a;\
	if constexpr( sizeof...( rest ) > 0 ) return  _T2##_of<rest...>( v );\
	return  (T2)-1;\
}\
constexpr auto T2##_of( T1 v ){\
	return  _T2##_of<__VA_ARGS__>( v );\
}\
template< auto A, auto a, auto...rest >\
constexpr auto _T1##_of( T2 v ){\
	if( a == v ) return  A;\
	if constexpr( sizeof...( rest ) > 0 ) return  _T1##_of<rest...>( v );\
	return  (T1)-1;\
}\
constexpr auto T1##_of( T2 v ){\
	return  _T1##_of<__VA_ARGS__>( v );\
}

usage:

gen_link( big, small,
	big::A, small::a,
	big::B, small::b,
	big::C, small::c
)
...
	cout << int( small_of( big::A ) ) << endl;
	cout << int( big_of( small::b ) ) << endl;

result:

2
1

당연하지만 상수인자면 O( 0 ) 로 동작하겠죠… 변수면 꼬리재귀구

4 Likes

c++17 문명의 이기 ㄷㄷ 너무 멋집니다.
modern macro

2 Likes

감사합니다.
parameter_pack이라는건 처음보는 문법이네요…
c++ 세계는 정말 넓고 공부해야되는게 참 많은것같네요

한가지 질문드릴게 있는데 제가 책으로 공부할때는 매크로를 쓰지 말라고 하던데
어떤경우에 이런케이스처럼 매크로를 사용해야하나요?

책을 버리세요

매크로 함수와 일반 함수의 차이를 알고써야된다고 해야지 매크로를 쓰면 안된다고 하면 작자가 80년대 독학 마인드인것