2010-06-02 4 views
16

boost::operators+=과 같은 수동 구현을 기반으로하는 +과 같은 연산자를 자동으로 정의하므로 매우 유용합니다. 부스트 예에서와 같이 T에 대한 그 사업자를 생성하려면, 하나는 boost::operators<T>에서 상속 :부스트 오퍼레이터는 어떻게 작동합니까?

class MyInt : boost::operators<MyInt>

나는 CRTP 패턴을 잘 알고,하지만 나는 여기서 일하는 방식을 볼 수 실패합니다. 특히, 운영자가 회원이 아니기 때문에 나는 어떤 시설도 상속받지 못하고 있습니다. boost::operators은 완전히 비어있는 것처럼 보입니다. 그러나 나는 부스트 소스 코드를 읽는 것이 좋지 않습니다.

누구나 자세히 설명 할 수 있습니까? 이 메커니즘이 잘 알려져 널리 사용되고 있습니까?

답변

14

거대한 다중 상속 체인이 있습니다. 맨 위에는 연산자를 구현하는 클래스가 많이 있지만, friend 함수로 구현하여 클래스의 멤버가 아닌 둘러싼 네임 스페이스에 배치합니다.

예를 들어, operator+의 최종 구현됩니다 :

template <class T, class U, class B = ::boost::detail::empty_base<T> > 
struct addable2 : B 
{                 
    friend T operator +(T lhs, const U& rhs) { return lhs += rhs; } 
    friend T operator +(const U& lhs, T rhs) { return rhs += lhs; } 
}; 
+4

정말로 재미있는 것은 당신이 클래스에서 개인적으로 상속하고 아직 작동합니다. 그것은 정말 재밌 트릭 :) –

+13

그것은 이름이있다 : [바튼 - Nackman 트릭] (http://en.wikipedia.org/wiki/Barton-Nackman_trick). –

관련 문제