2010-08-01 82 views
0

我想写一个迭代器类,它在解除引用时返回一个getter函数返回值。代码工作正常,我唯一的问题是我想只使用一个模板参数而不是3来编写member_ptr_functor,因为我应该能够推导出参数的类型并从成员函数类型返回值。我认为有问题的是参数类型,我尝试使用boost :: remove_ptr &,但我无法编译它。迭代指针向量的获取者

#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; 
} 

Hagai。

回答

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); 
} 

这可以让你写你想要的功能,而不必定义自己的函子,无使用太多的typedefs。

+0

感谢您的回答。 我不熟悉boost.range,它可能是一个很好的长期解决方案。然而,我提供的代码仅仅是一个例子,我实际上需要我的代码中的其他东西的迭代器。 – barisdad 2010-08-02 05:42:12