1. Generic Programming and the C++ Standard Library

제네릭 프로그래밍과 C++ 표준 라이브러리 활용 스타일을 알아보자.

  1. Uses and Abuses of vector

std::vector의 원소 접근에서 operator[]는 경계 체크를 하지 않고 .at()은 한다. 또한 .reserve(2) 한다고 해서 capacity가 2가 되는 것은 아니다. size/resize와 capacity/reserve는 다르다. 항상 const 정확성을 추구하라. 반복자를 !=로 비교하라. 후치 증감 연산자를 선호하라. 불필요한 재계산을 피하라. std::endl 대신 ‘\n’을 쓰라. std::copy, std::for_each를 쓰라.

2. The String Formatters of Manor Farm, Part 1: sprintf

sprintf 대신 C++20의 std::format을 사용하라.

3. The String Formatters of Manor Farm, Part 2: Standard (or Blindingly Elegant) Alternatives

C++17까지는 std::stringstream을 쓰라. 길이-안전, 타입-안전, 템플릿에 이용도 가능하다. boost::lexical_cast도 괜찮지만, 비표준이다.

4. Standard Library Member Functions

멤버 함수에 대한 래퍼로 std::mem_fn을 사용하라.

5. Flavors of Genericity, Part 1: Covering the Basis [sic]

C++의 템플릿은 컴파일 타임 다형성을 제공한다. 템플릿 함수를 쓰려면 템플릿 인자 타입이 컴파일 타임에 유추 가능해야 한다.

6. Flavors of Genericity, Part 2: Generic Enough?

포인터는 반복자이나, 반복자는 포인터가 아니다. 커스텀 클래스의 오브젝트를 교환하는 데 있어 단순한 대입 외에 다른 대안이 있다면 std::swap을 특수화하는 것을 고려하라.

7. Why Not Specialize Function Templates?

함수 템플릿은 부분 특수화될 수 없다. 대신 오버로딩될 뿐이다. 함수 템플릿 부분 특수화처럼 보이는 것은 사실 별개의 함수 템플릿이다. 함수 템플릿 특수화는 오버로딩 분석에 관여하지 않는다. 특수화는 주 템플릿이 선택되었을 때만 사용되고, 주 템플릿의 선택이 특수화되는지 아닌지에는 상관이 없다. 주 함수 템플릿을 오버로딩 분석에 관여하도록 커스텀화하고 싶으면 특수화하지 말고 템플릿 아닌 함수를 만들어라. 함수 템플릿의 오버로딩을 제공한다면, 특수화에 대한 오버로딩은 피하라. 주 함수 템플릿이 특수화가 필요하다면, 특수화나 오버로딩될 일이 없는 단일 함수 템플릿을 쓰고, 함수 템플릿은 같은 시그니쳐를 가진 정적 함수를 포함한 클래스 템플릿의 단순한 도구로 활용하라. 그러면 모든 이가 오버로딩 해결에 신경쓸 필요 없이 그 함수 템플릿을 부분적으로/완전히 특수화할 수 있다.

8. Befriending Templates

뜻하는 코드를 써라. 명시적으로 써라. 템플릿에 대해 의미하는 바가 확실치 않으면 템플릿 인자 리스트를 포함하라. 언어의 잘 알려지지 않은 면들을 피하라.

9. Export Restrictions, Part 1: Fundamentals

export는 C++20에서 모듈을 위한 키워드로 변경되었다.

10. Export Restrictions, Part 2: Interactions, Usability Issues, and Guidelines

export는 C++20에서 모듈을 위한 키워드로 변경되었다.