2013-05-24 2 views
0

내가 "라는 이름의 채널과 일치 boost.mpl를 사용하여 작은 메타 프로그램을 작성하는 것을 시도하고지도 부스트에서 키의 부스트 : : MPL : 벡터를 얻기 "두 채널 맵을 사용하여 오디오 형식으로 변환합니다.:: MPL :: iter_fold 또한 :: MPL ::

이름은 정수 (열거 형)입니다. 내가 좋아 보일 수 있습니다 런타임에 달성하기 위해 노력하고 무엇을 간단한 예 :

typedef int Name; 
std::map<int, int> map_channels(const std::map<int, Name>& m1, const std::map<Name, int>& m2) 
{ 
    std::map<int, int> result; 
    for (std::map<int, Name>::const_iterator it = m1.begin(); it != m1.end(); ++it) 
    { 
     result[it->first] = m2.find(it->second)->second; // Ignoring errors for example 
    } 
    return result; 
} 

int main() 
{ 
    std::map<int, Name> m1; 
    m1[0] = 20; 
    m1[1] = 22; 
    m1[2] = 21; 

    std::map<Name, int> m2; 
    m2[19] = 1; 
    m2[20] = 2; 
    m2[21] = 0; 
    m2[22] = 3; 

    std::map<int, int> m3 = map_channels(m1, m2); 
    for (std::map<int, int>::iterator it = m3.begin(); it != m3.end(); ++it) 
    { 
     std::cerr << it->first << ":" << it->second << std::endl; 
    } 
    return 0; 
} 

내가 boost.mpl를 사용하여 컴파일시 버전을 작성하려고 지금까지 뭔가가 있어요 :

typedef map< 
     pair<int_<0>, int_<20> > 
    , pair<int_<2>, int_<22> > 
    , pair<int_<3>, int_<21> > 
> m1; 

typedef map< 
     pair<int_<19>, int_<1> > 
     , pair<int_<20>, int_<2> > 
     , pair<int_<21>, int_<0> > 
     , pair<int_<22>, int_<3> > 
> m2; 
을 나는 다음과 같은 아이디어를 시도

typedef map< 
     pair<int_<0>, int_<2> > 
     , pair<int_<2>, int_<3> > 
     , pair<int_<3>, int_<0> > 
> mapping; 

: 내가 원하는 무엇

처럼 보이는 다른 두 개의 맵에서 3 번째지도를 만드는 것입니다

// TODO : Dont know how to obtain a vector of keys from a mpl map 
typedef vector<int_<0>, int_<2>, int_<3> > m1_keys; 
//typedef transform<m1, first<_1> >::type m1_keys; // This does not work. I tried a number of ideas and none worked 

// Create the composed function that given a key for m1, looks up the value and then uses that value as a lookup to m2 
// This is working fine. 
typedef at<m2, at<m1, _1> > composed_m1_m2_expr; 
typedef lambda<composed_m1_m2_expr>::type composed_m1_m2_lambda; 

// TODO : This fold is no good eithre. 
typedef iter_fold<m1_keys, map<>, insert<_1, pair<deref<_2>, apply<composed_m1_m2_lambda, _2 > > > >::type mapping; 

참고 :

struct print_iipair 
{ 
    template <typename data_tpt> 
    void operator()(data_tpt p) 
    { 
     (void)p; 
     std::cerr << "k: " << data_tpt::first::value << ", v: " << data_tpt::second::value << std::endl; 
     //std::cerr << "value: " << typeid(p).name() << std::endl; 
    } 
}; 

struct print_value 
{ 
    template <typename data_tpt> 
    void operator()(data_tpt p) 
    { 
     (void)p; 
     std::cerr << "value: " << data_tpt::value << std::endl; 
     //std::cerr << "value: " << typeid(p).name() << std::endl; 
    } 
}; 
... 
for_each<m1_keys,_>(print_value()); 
for_each<mapping,_>(print_iipair()); 

내 질문

은 다음과 같습니다 :

1) 어떻게 포함하는 부스트 : : MPL : 벡터를 만들 것 내가 좋아하는이 일에 대한 값을 인쇄하고 boost :: mpl :: map의 키? 나는이 iter_fold을 구현하는 것이 어떻게

2)? 나는 문제가 적용하고 사용 _2하지만,이 문제를

감사를 극복하는 방법을 잘하지 주위에 생각합니다.

답변

2

글쎄 그것은 솔루션은 소스 시퀀스 및 사용과 같은 유형의 컨테이너를 생산하고 당신은 MPL ::지도를 변환 할 수 없기 때문에 :: 변환 (MPL) 대신에 (MPL)의 배 :: 사용하는 것으로 나타났다 mpl :: push_back을 사용하여지도를 만들지 마십시오. 제대로 작동

내 두 솔루션은 다음과 같습니다

1) 어떻게 후원을 만들 것입니다 : 부스트 :: MPL ::지도를의 키를 포함 MPL : 벡터? 나는이 iter_fold을 구현하는 것이 어떻게

// Get a mpl::vector containing just the keys from the map m1 
typedef fold<m1, vector<>, push_back<_1, first<_2> > >::type m1_keys; 

2)?

// Create a mapping 
typedef at<m2, at<m1, _1> > composed_m1_m2_expr; 
typedef lambda<composed_m1_m2_expr>::type composed_m1_m2_lambda; 
typedef fold<m1_keys, map<>, insert<_1, pair<_2, composed_m1_m2_lambda::apply<_2> > > >::type mapping;