씹어먹는 C++ 12일차

❗참고 : https://modoocode.com/221 https://modoocode.com/222

Template Meta Programming (TMP)

  • template을 사용하는 프로그래밍 기법
  • 컴파일러에게 프로그램의 코드를 생성하게 함 (compile time에 결정하도록 하여 run time 시의 계산을 줄여줌)
  • TMP
    • type은 어떠한 객체에 무엇을 저장하느냐를 지정하기 위해 사용했었음
    • template을 사용하면, 객체를 생성하지 않더라도 type에 값을 부여할 수 있고 그 type을 이용하여 연산을 할 수 있음
    • type은 반드시 compile time에 확정되어야 하므로, compile time에 연산이 종료됨
    • Meta Programming : type을 가지고 compile time에 생성되는 코드로 프로그래밍 하는 것
      • C++의 경우, template을 활용하므로 TMP라고 부름

TMP의 활용

template <int N>
struct Factorial {
  static const int result = N * Factorial<N - 1>::result;  // 재귀함수와 같은 역할
}

template <>
struct Factorial<1> {  // template의 특수화를 활용하여, n이 1일 때를 따로 처리해줌
  static const int result = 1;
};

int main() {
  std::cout << Factorial<10>::result << std::endl;
  return 0;
}
  • static
    • 위치에 상관 없이 전역으로 메모리에 할당되어 있음
    • 프로그램이 처음 시작될 때 초기화되는 메모리 영역
    • 함수 내에 선언되는 경우, 함수 내부에서의 접근으로 제한
      • life cycle은 프로그램의 시작부터 끝까지, 즉 함수를 빠져나가도 없어지지 않고 남아있음
  • const
    • 해당 변수를 초기화한 이후에는 값을 바꾸지 못하도록 함
    • 함수 내에서 초기화되는 경우, 함수를 실행할 때마다 초기화를 수행함
    • 객체에 사용되는 경우 (객체의 상수화), 객체의 데이터를 변환하지 않음을 의미
  • static const
    • 고정해놓고 함수 내에서만 사용할 상수를 선언할 용도로 사용함

Generic programming

  • 참고
  • 정적 다형성
  • template을 이용한 프로그래밍
  • 자료형이 확정되지 않아도 클래스나 함수를 생성할 수 있음
  • type에 상관없이 암시적 다형성을 이용하여 동작할 수 있음
  • 주로 STL

auto keywoard

  • 추가 참고
  • c++ 11에서 지원
  • 선언된 변수의 type을 추론하도록 컴파일러에게 지시함
  • 변수의 type이 자동으로 결정됨 (type inference)
auto 변수명
  • 활용 예시
    • template으로 인해 복잡해진 코드를 정리할 때 활용
    • const, const& 과 같은 한정자와 함께 활용
    • range-base-loop
auto iNum = 5;
auto dNum = 5.0;

int add(int a, int b) {
  return a+b;
}
auto sumNum = add(5,5);  // add()가 int를 return 하므로 sumNum은 int가 됨


const auto autoNum = 1;

vector<int> v = {1,2,3,4,5};
// auto는 vector<int>::iterator 대신 사용 가능
for (auto it = v.begin(); it != v.end(); it++) {
  *it *= 2;
}