2009-05-01
Named Boost Tuple
프로토콜 객체로 std::pair 나 boost::tuple 을 채택할 때의 문제는 순서가 틀리더라도 타입만 변환이 된다면 컴파일 타임 에러가 나지 않는다는 점과, first/second 라든지 get() 이 한눈에 안들어온다는 점이다. 또 디버거에서도 내부 값을 찾아 보기가 힘들고 컴파일 시간도 길어지기 때문에, boost::preprocessor 나 boost::tuple 기반의 직렬화 기법이 편하고 관리하기도 좋지만, 그냥 구조체로 만들어서 적당히 memcpy로 보내는 걸 다들 애용하는 것이리라.
boost::tuple<int,short,char> t;
int i = get<0>(t);
int j = get<1>(t);
int k = get<2>(t);
그런데, 이걸 코드 생성기에서 이렇게 만들면 어떨까?
class login : public boost::tuple<wstring,string,int>
{
public :
const wstring & userid() const { return get<0>(); }
void userid( const wstring & v) { get<0>() = v; }
const string & passwd() const { return get<1>(); }
void passwd( const string & v) { get<1>() = v; }
int key() const { return get<2>(); }
void key( int v ) { get<2>() = v; }
};
login msg;
msg.userid(L"reiot");
msg.passwd(".com");
msg.key(1975);
wstring userid = msg.userid();
string passwd = msg.passwd();
int key = msg.key();
이 정도면 읽기도 쉽고 직렬화하기도 편한 객체처럼 보일 것 같은데... (여전히 디버거에서는 보기가 귀찮지만.. autoexp.dat 를 잘 고치면 해결할 수 있지 않을까나~)