More C++ Idioms/Boost mutant

진영민·2022년 7월 31일
1

More C++ Idioms

목록 보기
7/10

용어 정리

POD

plain old data
PDS(passive data structure)이라고도 한다.

  1. 복잡한 레이아웃을 갖지 않는다.(가상함수 등)
  2. 유저가 정의한 복사 의미론을 갖지 않는다.
  3. 간단한 기본 생성자를 갖고 있다.
struct S0 { }; // POD
struct S1 { int i; }; // POD
struct S2 { int i; S2(int ii) : i(ii) { } }; // 기본 생성자가 없으므로 POD가 아니다
struct S3 { int i; S3(int ii) : i(ii) { } S3() {} }; // POD
struct S4 { int i; S4(int ii) : i(ii) { } S4() = default; }; // POD
struct S5 { virtual void f(); }; // 가상 함수가 있으므로 POD가 아니다

struct S6 : S1 { }; // POD
struct S7 : S0 { int b; } // POD
struct S8 : S1 { int b; } // 기저 클래스에 비정적 멤버가 있으므로 POD가 아니다.
struct S9 : S0, S1 { }; // POD

Boost.Bimap

C++에서 양방향 맵을 빌드하기 위한 라이브러리

reinterpret_cast

reinterpret_cast<new_type>(expression)

로 사용하며, expression의 자료형을 new_type으로 변화시킨다.

의도

POD data인 std::pair<x,y>는 Reverse<std::pair<x,y>>를 이용하면 데이터가 역전된다.

하지만 이 Idiom은 데이터를 역전시키지 않고 역전된 것처럼 보일 수 있다.

코드 및 설명

template <class Pair>
struct Reverse
{
	typedef typename Pair::first_type  second_type;
	typedef typename Pair::second_type first_type;
	second_type second;
	first_type first;
};

template <class Pair>
Reverse<Pair> & mutate(Pair & p)
{
	return reinterpret_cast<Reverse<Pair> &>(p);
}

int main(void)
{
	std::pair<double, int> p(1.34, 5);
    std::cout << "p.first = " << p.first 
        << ", p.second = "  << p.second << std::endl
        << "mutate(p).first = " << mutate(p).first 
        << ", mutate(p).second = "  << mutate(p).second << std::endl;
 }

mutate(p)는 p 안에 있는 데이터의 이름을 바꾼다. 따라서 데이터를 물리적으로 뒤집지 않고도 Reverse< Pair >처럼 만들 수 있으며, 데이터를 재구성하지 않아도 된다.

profile
코린이

0개의 댓글