c++ 예제 - 바인드는 일반적으로 장면 뒤에서 어떻게 작동합니까?




boost bind (4)

부스트 소스 코드를 검토하는 데 오랜 시간을 들이지 않고도, 누군가가 boost bind가 구현 된 방법에 대한 간단한 요약을 줄 수 있습니까?


Answers

저는 이것이 당신이 바인드하고자하는 인자에 대한 멤버 변수를 선언하고 나머지 인자에 대해 오버로드 (overloads)하는 템플릿 클래스라고 생각합니다.


그런데 boost/bind/bind_template.hpp 를 포함하여 bind_t 가 축소되고 단순화되면 다음과 같이 이해하기가 더 쉬워집니다.

template<class R, class F, class L> 
class bind_t
{
    public:

        typedef bind_t this_type;

        bind_t(F f, L const & l): f_(f), l_(l) {}

        typedef typename result_traits<R, F>::type result_type;
        ...
        template<class A1> 
            result_type operator()(A1 & a1)
            {
                list1<A1 &> a(a1);
                return l_(type<result_type>(), f_, a, 0);
            }
    private:
        F f_;
        L l_;

};

나는 bind 소스의이 조각이 마음에 든다.

template<class R, class F, class L> class bind_t
{
public:

    typedef bind_t this_type;

    bind_t(F f, L const & l): f_(f), l_(l) {}

#define BOOST_BIND_RETURN return
#include <boost/bind/bind_template.hpp>
#undef BOOST_BIND_RETURN

};

정말로 당신이 알 필요가있는 거의 전부를 말해줍니다.

bind_template 헤더는 인라인 operator() 정의 목록으로 확장됩니다. 예를 들어, 가장 단순한 :

result_type operator()()
{
    list0 a;
    BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}

BOOST_BIND_RETURN 매크로가이 시점에서 return 되도록 확장되어 returnreturn BOOST_BIND_RETURN return l_(type...) 과 비슷합니다.

하나의 매개 변수 버전은 다음과 같습니다.

template<class A1> result_type operator()(A1 & a1)
{
    list1<A1 &> a(a1);
    BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}

그것은 꽤 비슷합니다.

listN 클래스는 매개 변수 목록에 대한 래퍼입니다. 여기에 많은 깊은 마술이 일어나서 나는 너무 많이 이해하지 못합니다. 그들은 또한 신비한 unwrap 함수를 호출하는 operator() 를 오버로드했습니다. 일부 컴파일러 관련 오버로드를 무시하면 많은 일을하지 않습니다.

// unwrap

template<class F> inline F & unwrap(F * f, long)
{
    return *f;
}

template<class F> inline F & unwrap(reference_wrapper<F> * f, int)
{
    return f->get();
}

template<class F> inline F & unwrap(reference_wrapper<F> const * f, int)
{
    return f->get();
}

명명 규칙은 다음과 같습니다. Fbind 함수 매개 변수의 형식입니다. R 은 반환 유형입니다. L 은 매개 변수 유형의 목록이되는 경향이 있습니다. 매개 변수의 수에 따라 9 개 이상의 과부하가 없기 때문에 많은 복잡성이 있습니다. 너무 많이 머물지 않는 것이 좋습니다.


객체를 인식하는 데 사용되는 색상 설명 자의 무리가 있습니다. 아래의 논문은 그 중 많은 부분을 비교합니다. 그들은 SIFT 또는 SURF와 결합 할 때 특별히 강력합니다. SURF 또는 SIFT만으로는 코카콜라가 매우 흥미롭지 않습니다. 왜냐하면 그들은 많은 관심 지점을 인식하지 못하기 때문에 색상 정보가 필요합니다. 프로젝트에서 SURF와 함께 BIC (테두리 / 내부 픽셀 분류)를 사용하며 객체를 인식하는 데 큰 효과가있었습니다.

웹 이미지 검색을위한 컬러 디스크립터 : 비교 연구





c++ boost boost-bind