: (아마 부스트 한 줄의 보일러 플레이트의 공정한 비트가있다)과 같이 정의
#include <map>
#include <vector>
template< class X, class Y >
void test(const std::map<X, Y>& mp)
{
printEither(mp.begin(), mp.end(), MakeMapDerefence(mp));
}
template< class Y >
void test(const std::vector<Y>& vec)
{
printEither(vec.begin(), vec.end(), MakeSimpleDereference(vec));
}
대답. 나는 경우 누구라도 여기를 게시하고있어 유용 발견 :
#include <iostream>
#include <map>
#include <vector>
#include <boost/iterator/iterator_adaptor.hpp>
//------------------------------------------------------------------------------
template <class Iterator>
void print(Iterator begin, Iterator end)
{
for (Iterator it=begin; it!=end; ++it)
std::cout << *it << "\n";
}
//------------------------------------------------------------------------------
template <class BaseIterator>
class MapDataIterator :
public boost::iterator_adaptor<
MapDataIterator<BaseIterator>,
BaseIterator,
typename BaseIterator::value_type::second_type >
{
public:
typedef typename BaseIterator::value_type::second_type& reference;
MapDataIterator() {}
explicit MapDataIterator(BaseIterator base)
: MapDataIterator::iterator_adaptor_(base) {}
private:
friend class boost::iterator_core_access;
reference dereference() const
{return this->base_reference()->second;}
};
//------------------------------------------------------------------------------
int main()
{
std::vector<int> vec;
vec.push_back(31);
vec.push_back(41);
std::map<int,int> map;
map[31] = 41;
map[59] = 26;
typedef MapDataIterator< std::map<int,int>::iterator > DataIter;
print(vec.begin(), vec.end());
print(DataIter(map.begin()), DataIter(map.end()));
}
이 솔루션은 알고리즘이 인식되지 않을 필요는 추가 된 장점을 가지고 어떻게 반복자를 역 참조한다. "데이터 시퀀스"를 예상하는 기존 알고리즘에 대해서도 재사용 할 수 있습니다.
나는이 작은 동물이 부스트에 이미 존재하지 않는다는 것에 놀랐다.
내가 원하는 것은 불가능할 수도 있습니다. :-( –