[C++] 항목 54: TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자
카테고리: Cpp
태그: Cpp
이 글은 아래의 책을 자세히 정리한 후, 정리한 글을 GPT에게 요약을 요청하여 작성되었습니다.
이펙티브 C++ 제3판, 스콧 마이어스 저자, 곽용재 번역
📦 9. 그 밖의 이야기들
👉🏻 항목 54: TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자
📚 C++ 표준의 역사
- 1998년: C++의 표준(언어를 정의한 문서 및 라이브러리 집합)이 최종 승인되었다
- 2003년: C++98, 전체 틀을 해치지 않는 버그 수정판이 나왔다
- 2011년: C++0x(현재 C++11로 불림)가 출시되었다
- TR(Technical Report) 1과 2가 일부 포함되었다
🔧 C++98 표준 라이브러리 구성 요소
표준 템플릿 라이브러리(STL):
- 컨테이너, 반복자, 알고리즘, 함수 객체, 컨테이너 어댑터, 함수 객체 어댑터 등이 있다
iostream:
- 사용자 정의 버퍼링, 국제화 기능이 가능한 입출력을 지원한다
cin,cout,cerr,clog등의 사전정의 객체를 지원한다
국제화 지원:
- 여러 로케일(Locale)을 활성화시킬 수 있는 기능 포함
- 로케일: 사용자가 UI에서 국가, 지역에 따라 선호하는 내용을 저장해둔 것
wchar_t(대개 16비트/문자) 및wstring(wchar_t타입으로 정의한 string) 등을 쓰면 유니코드를 사용할 수 있다
수치 처리 지원:
- 복소수를 나타내는 템플릿(
complex) - 수치 배열을 나타내는 템플릿(
valarray)
예외 클래스 계통:
- 최상위 클래스
exception exception의 파생 클래스인logic_error및runtime_error
C89의 표준 라이브러리:
- 1989년의 C의 표준 라이브러리 모두 포함
🆕 TR1의 구성 요소
스마트 포인터:
shared_ptr,weak_ptr- 동작은 기본제공 포인터와 동일
- 참조 카운팅(reference counting) 사용
tr1::function (항목 35):
- 어떤 함수가 가진 시그니처와 호환되는 시그니처를 갖는 함수호출성 객체의 표현을 가능하게 해주는 템플릿
// int를 받고 string을 반환하는 함수가 매개변수 타입
void registerCallback(string func(int));
// 매개변수 이름을 생략할 수도 있다.
void registerCallback(string (int));
// 반환 값, 매개변수 값을 암시적으로 변환할 수 있는,
// 함수를 매개변수로 설정할 수 있게 된다.
void registerCallback(function<stirng>(int) func);
string(int)부분이 함수 시그니처이다
tr1::bind (항목 35):
- 상수/비상수 멤버 함수 상관없이 동작한다
- 참조로 전달되는 매개변수에도 동작한다
- 함수 포인터를 자체적으로 다룰 수 있다
해시 테이블:
set,multiset,map,multimap을 해시기반 컨테이너로 구현하는데 해시 테이블이 사용되었다unordered_set,unordered_multiset,unordered_map,unordered_multimap이 그들이다- 기존 컨테이너와의 차이점으로 원소 저장 순서를 예측할 수 없다
정규 표현식:
- 정규 표현식 기반의 탐색과 문자열에 대한 대체 연산이 가능하다
- 일치되는 원소들 사이의 순회를 지원한다
- 현재 <regex> 라이브러리에 포함되어 있다
튜플(tuple):
pair템플릿의 신세대 버전이다pair은 2개만 담을 수 있었던 반면,tuple은 얼마든지 담을 수 있다
tr1::array:
begin,end등과 같은 멤버 함수를 지원한다array객체 크기는 컴파일 과정에서 고정된다- 즉, 동적 메모리를 사용하지 않는다
- 멤버 함수 포인터를 적응(adapt)시키는 용도에 쓸 수 있는 템플릿이다
- C++98의
mem_fun및mem_fun_ref의 확장 버전이다
tr1::reference_wrapper:
- 기존 참조자가 객체처럼 행사할 수 있도록 하는 템플릿이다
난수 발생:
- C 표준 라이브러리의
rand보다 훨씬 우수하다
특수 용도의 수학 함수:
- 라게르(Laguerre) 다항식, 베셀(Bessel) 함수, 완전 타원 적분(complete elliptic integral) 등 다양한 수학 함수들이 있다
C99 호환성 확장 기능:
- C99의 새로운 라이브러리를 C++로 가져올 목적으로 설계된 함수 및 템플릿 모음
타입 특성정보(type traits):
- 컴파일 타임에 주어진 타입 정보를 제공하는 특성정보 클래스(항목 47 참조)
T라는 타입에 대해 기본제공 타입인지, 가상 소멸자를 지원하는지,
공백 클래스인지, 다른U타입으로 암시적 변환이 가능한지 등의 정보를 알 수 있다
tr1::result_of:
- 어떤 함수 호출의 반환 타입을 추론하는 템플릿
- 함수(템플릿)의 호출로 반환되는 객체의 타입을 알고 싶을 때 사용한다
💡 TR1스럽게 사용하기
namespace std {
namespace tr1 = ::boost;
}
과거의 사용법:
- 부스트의
TR1스러운 라이브러리를 써보고자 할 때 사용했다 - 이러한 꼼수를 사용했을 때의 결과는 정의되어있지 않다
- 현재는 사용할 필요가 없다
🧐 정리
최초에 상정된 표준 C++ 라이브러리의 주요 구성요소:
- STL
- iostream
- 로케일(locale)
- 수치처리 지원
- 예외 클래스 계통
- C89 표준 라이브러리
TR1에서 추가된 것:
- 스마트 포인터
- 일반화 함수 포인터
- 해시 기반 컨테이너
- 정규 표현식
- 이외 10개로, 총 14개
TR1 기능 사용:
- TR1의 기능을 사용하기 위해선 명세를 구현한 코드가 필요하다
- TR1 구현을 구할 수 있는 곳이 부스트이다
- 현재는 필요없다
댓글남기기