본문 바로가기

중복적재3

보편참조에 대한 중복적재 대신 사용할 수 있는 기법들을 알아두라 2 보편참조를 받는 템플릿을 제한한다. std::enable_if는 컴파일러가 특정 템플릿을 존재하지 않는 것처럼 할 수 있다. 그런 템플릿을 비활성화된 템플릿이라고 한다. 기본적으로 모든 템플릿은 활성화 상태이지만 std::enable_if를 사용하는 경우, 특정 조건이 만족될 때에만 활성화된다. 일단 기존의 예제에 std::enable_if만 추가해보자 class Person{ public: template explicit Person(T&& n); ... }; // std::enable_if와 그 작동원리인 SFINAE는 나중에 따로 정리 여기서 우리가 지정하려고 하는 조건은 T가 Person이 아니라는 것이다. 이것을 판별할 유용한 형식특질로 두 형식이 같은지를 판별하는 std::is_same이 있다.. 2020. 7. 23.
보편참조에 대한 중복적재 대신 사용할수 있는 기법들 1 1. 중복적재를 포기한다 중복 적재 버전에 각자 다른 이름을 붙여 보편 참조에 대한 단점을 피할 수 있다. 하지만 생성자의 이름은 언어에 의해 고정되기 때문에 중복적재가 필요할 수 있다. 2. const T& 매개변수를 사용한다. 보편 참조 매개변수 대신 const에 대한 왼값 참조 매개변수를 사용한다. 이런 설계는 원하는 만큼 효율적이지 않다. 3. 값 전달 방식의 매개변수를 사용한다 참조 전달 매개변수 대신 값 전달 매개변수를 사용한다. 복사될 것이 확실한 객체는 값으로 전달하는 것을 고려하는 것이 좋다. 앞에 설명했던 예제의 Person을 사용해 결과를 보도록 하자 class Person { public: explicit Person(std::string n)// T&& 생성자를 대체한다 : nam.. 2020. 7. 22.
객체 생성시 괄호와 중괄호의 구분 C++에서는 초기화 값을 괄호, 등호, 중괄호로 지정할 수 있고 등호와 중괄호를 함께 사용할 수 있는 경우도 많다. int x(0);// 초기치를 괄호로 감싼 예 int y = 0;// 초기치를 "=" 다음에 지정한 예 int z{ 0 };// 초기치를 중괄호로 감싼 예 int t = { 0 };// "="와 중괄호로 초기치를 지정한 예 대체로 C++은 등호와 중괄호 구문은 중괄호만 사용한 구문과 동일하게 취급한다. int같은 내장 형식에서 초기화와 배정은 학술정긴 차원에서만 차이가 나지만 사용자 정의 형식에서는 초기화와 배정이 각자 다른 함수들을 호출하기 때문에 둘을 구분해야 한다. Widget w1;// 기본 생성자를 호출 Widget w2 = w1;// 배정이 아님, 복사 생성자를 호출 w1 = w.. 2020. 6. 29.