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