plain old data
PDS(passive data structure)이라고도 한다.
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
C++에서 양방향 맵을 빌드하기 위한 라이브러리
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 >처럼 만들 수 있으며, 데이터를 재구성하지 않아도 된다.