원본 : http://www.debuglab.com/knowledge/pair.html
1.요약
이런 고민을 해 보신적이 있으시죠? 포인터형을 반환하는 함수라면 예외상황을 알리기 위해서 NULL을 반환하면 되는데, 기본형이나 객체 혹은 레퍼런스 타입을 반환하는 경우라면 NULL 처럼 분명한 값이 없습니다.
EOF처럼 특정한 값을 에러값으로 정의해 놓는다거나 HRESULT 처럼 비트별로 의미를 부여하는 방법이 거의 대부분일 것입니다.
pair는 이런 경우에 한 번쯤은 생각해 볼 수 있는 템플릿 클래스 입니다.
2.본문
pair는 다음과 같이 단순합니다.
template<class T, class U>
struct pair {
typedef T first_type;
typedef U second_type
T first;
U second;
pair();
pair(const T& x, const U& y);
template<class V, class W>
pair(const pair<V, W>& pr);
};
두 개의 멤버 변수를 가진 구조체 정도로 생각하시면 딱 맞습니다. 이정도 클래스라면 직접 만들어서 쓰는 것도 나쁘지는 않겠죠. 하지만 pair는 표준입니다.
간단한 예제를 살펴보겠습니다.
[예제 - Windows Console Application]
// pair.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <utility>
using namespace std;
typedef pair<bool, int> RET_TYPE;
RET_TYPE Func()
{
return make_pair( false, 3571);
//return RET_TYPE( false, 3571);
}
int main(int argc, char* argv[])
{
RET_TYPE ret = Func();
if( false == ret.first )
{
return ret.second;
}
return 0;
}
[예제 설명]
#include <utility> using namespace std;
pair 클래스와 make_pair 함수는 utility에 선언되어 있습니다. 역시 STL의 일부이기 때문에 std라는 이름의 네임스페이스 안에서 선언되어 있습니다.
--------------------------------------------------------------
typedef pair<bool, int> RET_TYPE;
우리의 용도에 맞는 pair 클래스형을 선언하는 순간입니다.
각각 bool과 int형을 갖는 멤버 2개를 갖는 것을 의미하겠죠.
--------------------------------------------------------------
return make_pair( false, 3571);
make_pair 함수는 하나의 pair 객체를 생성해서 반환하는 함수 입니다. pair객체의 타입은 매개변수의 의존해서 결정합니다.
여기서는 각각 bool, int 형인 false, 3571을 넘겨주었으므로 make_pair 함수는 pair
좀 더 추상적으로 생각하자면, 우리의 함수는 실패했다는 false와 실패의 원인인 3571을 함께 반환하고 있습니다.
--------------------------------------------------------------
//return RET_TYPE( false, 3571);
이 부분은 주석 처리해두었죠. 위의 return make_pair...; 대신에 이 문장을 사용해도 같은 결과를 얻을 수 있습니다. 이유는 pair 클래스는 이미 두 개의 인자를 갖는 생성자를 가지고 있기 때문입니다.
--------------------------------------------------------------
if( false == ret.first )
{
return ret.second;
}
반환값이 실패를 의미한다면, 다시 실패의 원인을 반환하면서 프로그램은 종료합니다.
--------------------------------------------------------------
유틸리티라는 것이 이렇게 사용하기 힘들어서야 되겠냐라고 반문하시는 분이 계실 수도 있겠네요. 이 글의 의미는 각자 받아들이시길 바랍니다.
3.예제
4.참고
MSDN
The Practice of Programming
The C++ Programming Language
- 2001.08.13 Smile Seo -
- 실수(소수점) 나누셈 연산을 정수 연산으로 하기 (0)2007/03/01
- WORD 특정 비트값 알아내기 (0)2007/03/01
- pair 라는 것의 용도는? (0)2007/03/01
- Alt+F4 키로 종료되는거 막는 방법 (0)2007/03/01
- 문자열을 _T() 형으로 바꿔주는 매크로 (0)2007/03/01

수안이의 컴퓨터 연구실



Leave your greetings.