More C++ Idioms/Barton-Nackman trick

진영민·2022년 7월 16일
1

More C++ Idioms

목록 보기
5/10

의도

overload operator를 namespace안에 둘 수 없거나 함수 탬플릿에 Overloading resolution을 할 수 없을 경우 사용하는 Idiom

Overload resolution

재정의된 함수를 호출할 때 컴파일러는 함수 인자의 의존하여 함수를 선택한다.
탬플릿 함수의 경우에는 후보함수가 여러개일 때 하나를 선택하는데, 이를 Overload resolution이라 한다.

하지만 이 idiom이 나올 당시에는 함수 template의 재정의를 지원하지 않았다.
따라서 template함수를 재정의하기 위해 다른 방법이 필요했다.

해결 방법

template<typename T>
class List {

public:
friend bool operator==(const List & lft,const List & rgt) {
// ...
}
};
-->해당 함수를 template class 안에 friend로 정의하는 것.

이를 통해

bool operator==(const List<T> & lft,const List<T> & rgt) {
    // ...
}

이러한 형태의 함수는 클래스 안에서 구체적인 타입의 인자를 가진 전역함수가 된다.
class를 정의할 때, template의 자료 타입이 정의되므로 해당 함수는 class에서 정해진 타입만을 인자로 가진 함수가 된다.

따라서 해당 함수는 template 함수가 아니므로 다른 비템플릿 함수처럼 Overload Resolution을 통해 선택될 수 있게 된다.

참고로 현재 C++은 template함수의 재정의가 가능하므로 더 이상 본래의 목적으로 사용하지는 않는다.

Curiously Recurring Template Pattern

자기 자신을 템플릿 인자로 활용하여 인스턴스화 되는 패턴.

일반적으로는

template<typename T>
struct base

{
	//...
};

struct derived: base<derived>
{
	//...
};

이러한 방법으로 사용된다.

Barton-Nackman trick에 이러한 패턴을 사용하면,

template<typename T>
class EqualityComparable {
public:
    friend bool operator==(const T & lft, const T & rgt) { return lft.equalTo(rgt); }
    friend bool operator!=(const T & lft, const T & rgt) { return !lft.equalTo(rgt); }
};

class ValueType :
    private EqualityComparable<ValueType> {
 public:
    bool equalTo(const ValueType & other) const;
};

이러한 방식으로 일반화시킬 수 있다.

profile
코린이

0개의 댓글