2010-08-01 6 views
0

dereferenced 때 getter 함수 반환 값을 반환하는 iterator 클래스를 작성하려고합니다. 이 코드는 잘 작동하지만, 유일한 문제는 멤버 함수 유형에서 인수의 유형과 반환 값을 추측 할 수 있어야하기 때문에 하나의 템플릿 매개 변수와 3을 사용하지 않고 member_ptr_functor를 작성하고 싶습니다. 문제가되는 인자가 인자 타입이라고 생각합니다. boost :: remove_ptr &을 사용해 보았지만, 컴파일 할 수 없었습니다.포인터 벡터 벡터의 반복 getter

#include <iostream> 
#include <vector> 
#include <boost/iterator/transform_iterator.hpp> 
#include <boost/iterator/indirect_iterator.hpp> 
using namespace boost; 
using namespace std; 

class CTest 
{ 
private: 
    int m_x; 

public: 
    CTest(int x) : m_x(x) 
    { 
    } 

    const int& GetX() const 
    { 
     return m_x; 
    } 

}; 

template<typename MemFunType, typename ArgumentType, typename ResultType> 
class member_ptr_functor : public unary_function<ArgumentType, ResultType> 
{ 
private: 
    MemFunType m_MemFun; 

public: 
    typedef ArgumentType argument_type; 
    typedef ResultType result_type; 

    member_ptr_functor(MemFunType MemFun) : m_MemFun(MemFun) 
    { 
    } 

    result_type operator() (argument_type arg) const 
    { 
     return m_MemFun(&arg); 
    } 
}; 

template<typename MemFunType, typename ArgumentType, typename ResultType> 
member_ptr_functor<MemFunType, ArgumentType, ResultType> make_member_ptr_functor(MemFunType MemFun) 
{ 
    return member_ptr_functor<MemFunType, ArgumentType, ResultType>(MemFun); 
} 

class CPrintFunctor : public unary_function<int, void> 
{ 
public: 
    void operator() (const int n) const 
    { 
     cout << n << endl; 
    } 
}; 

int main() 
{ 
    typedef vector<CTest> Container_t; 
    Container_t v; 
    v.push_back(CTest(1)); 

    CPrintFunctor PF; 
    Container_t::const_iterator itStart = v.begin(); 
    Container_t::const_iterator itEnd = v.end(); 

    typedef member_ptr_functor<const_mem_fun_t<const int&, CTest> , CTest, const int&> member_ptr_functor_t; 
    member_ptr_functor_t MemberPtrFunctor =  member_ptr_functor_t(mem_fun(&CTest::GetX)); 

    typedef transform_iterator<member_ptr_functor_t, Container_t::const_iterator, const int&, const int> transform_iterator_t; 
    transform_iterator_t itTransformStart = make_transform_iterator(itStart, MemberPtrFunctor); 
    transform_iterator_t itTransformEnd = make_transform_iterator(itEnd, MemberPtrFunctor); 

    for_each(itTransformStart, itTransformEnd, PF); 

    return 0; 
} 

하가이.

답변

0

이 질문은 귀하의 질문에 직접적으로 대답하는 것이 아니라 오히려 대안적인 접근 방법을 제시합니다.

이미 부스트를 사용하고, 왜 당신이 한 단계 더 걸릴하지 않습니다 Boost.Range에게를 사용

#include <boost/functional.hpp> 
#include <boost/range.hpp> 
#include <boost/range/algorithm/for_each.hpp> 
#include <boost/range/adaptor/transformed.hpp> 

// ... 

int main() 
{ 
    // ... 
    boost::range::for_each (
    boost::adaptors::transform (v, boost::mem_fun_ref (&CTest::GetX)), 
    PF); 
} 

이것은 당신이 자신의 펑터를 정의하지 않고도없이 원하는 기능을 작성할 수 있습니다 너무 많은 typedef를 사용한다.

+0

답변 해 주셔서 감사합니다. boost.range에 익숙하지 않아 장기적인 해결책이 될 수 있습니다. 그러나 필자가 제공 한 코드는 예제 일 뿐이며 실제로 다른 코드에 대한 반복자가 필요합니다. – barisdad