2010-11-18 8 views
3

boost::fusion::map에 대한 반복기를 얻으려고하고 있지만 뭔가 빠져 있습니다. boost::fusion::vector이터레이터를 부스트 퓨전 맵으로 가져 오는 방법은 무엇입니까?

다음 작품 :

typedef vector<int,char,double> vector_t; 
vector_t vec(20,'B',14.5); 
typedef result_of::begin<vector_t>::type vb; 
typedef result_of::end<vector_t>::type ve; 

vb vb_(vec); 
ve ve_(vec); 
iterator_range<vb,ve> range(vb_,ve_); 
std::cout << range << std::endl; 

출력 :

(20 B 14.5) 

내가 fusion::map와 비슷한 일을하고 싶습니다하지만 컴파일에 실패 :

typedef map< pair<int,char>, pair<double, std::string> > map_t; 
typedef result_of::begin<map_t>::type b; 

map_t m(pair<int,char>('C'), pair<double, std::string>("CEE")); 

//b b_(m); // this fails to compile 

I을 다음을 포함한 m :

,
#include <iostream> 
#include <string> 

#include <boost/fusion/support/pair.hpp> 
#include <boost/fusion/include/pair.hpp> 

#include <boost/fusion/container/map.hpp> 
#include <boost/fusion/include/map.hpp> 
#include <boost/fusion/container/map/map_fwd.hpp> 
#include <boost/fusion/include/map_fwd.hpp> 

#include <boost/fusion/sequence/intrinsic/begin.hpp> 
#include <boost/fusion/include/begin.hpp> 

#include <boost/fusion/sequence/intrinsic/end.hpp> 
#include <boost/fusion/include/end.hpp> 

#include <boost/fusion/view/iterator_range.hpp> 
#include <boost/fusion/include/iterator_range.hpp> 

#include <boost/fusion/sequence/io.hpp> 
#include <boost/fusion/include/io.hpp> 

using namespace boost::fusion; 

오류 :

main.cpp: In function 'int main()': 
    main.cpp:83: error: no matching function for call to 'boost::fusion::basic_iterator<boost::fusion::map_iterator_tag, 
boost::fusion::map<boost::fusion::pair<int, char>, boost::fusion::pair<double, 
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_>::category, boost::fusion::map<boost::fusion::pair<int, char>, 
boost::fusion::pair<double, std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > >, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_>, 0>::basic_iterator(main()::map_t&)' 
    /home/bimbo/local/linux/include/boost- 
1_43_0/boost/fusion/iterator/basic_iterator.hpp:125: note: candidates are: 
boost::fusion::basic_iterator<Tag, Category, Seq, Index>::basic_iterator(Seq&, int) [with 
Tag = boost::fusion::map_iterator_tag, Category = 
boost::fusion::map<boost::fusion::pair<int, char>, boost::fusion::pair<double, 
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_>::category, Seq = boost::fusion::map<boost::fusion::pair<int, char>, 
boost::fusion::pair<double, std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > >, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_>, int Index = 0] 
    /home/bimbo/local/linux/include/boost- 
1_43_0/boost/fusion/iterator/basic_iterator.hpp:43: note:     
boost::fusion::basic_iterator<boost::fusion::map_iterator_tag, 
boost::fusion::map<boost::fusion::pair<int, char>, boost::fusion::pair<double, 
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_>::category, boost::fusion::map<boost::fusion::pair<int, char>, 
boost::fusion::pair<double, std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > >, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_>, 0>::basic_iterator(const 
boost::fusion::basic_iterator<boost::fusion::map_iterator_tag, 
boost::fusion::map<boost::fusion::pair<int, char>, boost::fusion::pair<double, 
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_>::category, boost::fusion::map<boost::fusion::pair<int, char>, 
boost::fusion::pair<double, std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > >, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_>, 0>&) 
    scons: *** [main.o] Error 1 

답변

4

fusion::for_each 보면, 그것은 반복자를 얻을 수 fusion::begin()fusion::end()를 사용합니다. 내가 fusion::map에 적용 할 때 그것은 작동합니다

typedef map< pair<int,char>, pair<double, std::string> > map_t; 
typedef result_of::begin<map_t>::type b; 
typedef result_of::end<map_t>::type e; 

map_t m(pair<int,char>('C'), pair<double, std::string>("CEE")); 

b b_(begin(m)); 
e e_(end(m)); 

iterator_range<b,e> range(b_,e_); 

std::cout << "map_t: \n" << range << std::endl; 

또는 인라인 :

iterator_range<b,e> range(begin(m),end(m)); 

출력 :

map_t: 
(C CEE)