당신은 정말, 여기 필요하지 않습니다. 이 기본 클래스이기 때문에 소멸자가 (멤버라고,
- : CRTP 두 가지 편리한 기능을 가지고 있습니다 그래서 위키 백과 페이지의 예는, 유형의 존재 얼마나 많은 개체의 누적 합계를 유지하는 것이 당신은 알게 될 것이다 이 또한 달성 할 것이다).
- 파생 클래스 유형에 템플릿이 포함되어 있기 때문에 여러 상속을 사용하여 각자 자신의 CRTP 기반을 포함하고 많은 코드를 작성하지 않으면 계층 구조의 여러 클래스를 포함하여 각 클래스에 대해 별도의 카운터가 상속됩니다. 각 클래스. 당신은 단지 하나의 클래스의 각 구성원에 대해 고유 한 값을 원하는 경우에
, 다음 스레드 안전 제쳐두고 당신이 이런 식으로 작업을 수행 할 수 있습니다
int get_id() {
static int counter = 0;
return ++counter;
}
class Address {
int addr;
public:
Address() : addr(get_id()) {}
};
을 CRTP 예에 따라, 당신은 get_id
을 템플릿 수 추적 할 다중 클래스가 있고 각 클래스가 자신의 ID 공간을 갖기를 원하면 Address
을 인수로 사용하십시오.
그리고이 사용 사례의 경우 CRTP를 사용하면 데이터 멤버를 템플릿 기본 클래스에 넣을 수 있습니다. 클래스를 많이 사용하는 경우에는 이점이 있습니다. 각 클래스에 대해 입력하기가 적기 때문에 그것 :
template <typename Derived>
class unique_addr {
protected:
int addr;
unique_addr() : addr(get_id<Derived>()) {}
};
class Address : public unique_addr<Address> {
};
class OtherAddress : public unique_addr<OtherAddress> {
};
+1, 그리고'get_id' 더욱 구현의 세부를 만드는 클래스의 개인 정적 함수가 될 수 있습니다. 표시된 솔루션은 스레드로부터 안전하지 않으므로 다중 스레드 환경에서 실행하는 경우주의하십시오. –
명확하고 완전한 설명! 고마워요! – Jir