2016-12-01 11 views
2

나는 boost fusion을 사용하고있다. 맵의 필드에 할당하고 다양한 다른 기능을 수행하는 템플릿 함수를 선언하고 싶습니다. 나는 퓨전 맵에 저장된 엘레멘트의 타입을 얻는 방법을 배우지 못한다. 나는 그것이 가능하다는 것을 확신한다 - 나는 다만 문서를 짐작할 수 없다. 나는 두 가지 문제가 있다고 생각 :boost :: fusion :: map에서 값의 형식을 얻으려면 어떻게해야합니까?

  1. 나는 올바른 헤더가 포함이되지 않을 수 있습니다 - 컴파일러가 불완전한 형태의 불평 : 부스트 :: 융합 :: 확장 :: value_of_data_impl
  2. 나는 전혀 명확한 방법입니다 result_of, value_of_data 등을 사용하십시오.

이 사실을 명확하게 유지하려면 최소한의 테스트 사례가 아래에 나와 있습니다.

#include <string> 
#include <boost/shared_ptr.hpp> 
#include <boost/fusion/include/container.hpp> 
#include <boost/fusion/container.hpp> 
#include <boost/fusion/iterator.hpp> 

using std::string; 

using namespace boost; 

namespace fields { 
    struct rgb; 
    struct gray; 
    struct keypoints; 
    struct edges; 
    struct objects; 
} 

typedef fusion::map< 
    fusion::pair<fields::rgb,  string>, 
    fusion::pair<fields::gray,  int>, 
    fusion::pair<fields::keypoints, int>, 
    fusion::pair<fields::edges,  int>, 
    fusion::pair<fields::objects, double> 
> Fields; 

Fields A_map; 

template<typename field> 
void Add(fusion::result_of::value_of_data<field> data) { 
    fusion::at_key<field>(A_map) = data; 
} 

int main() { 
    Add<fields::gray>(123); 
} 

함수가 추가

회색 필드 (이 예의 INT)의 타입 인수를 수신하도록 선언한다.

+0

문서에 따르면 'value_of_data'는 이터레이터에서만 사용됩니다. 나는 당신이 원하는 metafunction이'value_at_key'라고 생각한다. 그것이 내가 지금 할 수 없기 때문에 질문에 답하십시오. – llonesmiz

답변

2

@jv 예, 정확하게 대답입니다. 매우 감사합니다.

필자는 몇 시간 동안 퓨전을 사용하고 있었으며 설명서에서 발견하지 못했습니다 (iterator의 함수는 최상위 수준에서 볼 수 있지만 value_at_key는 Sequence/intrinsic으로 파고들 때만 표시됨)./metafunctions)

입력 이름을 사용해야하고 더 간단하게하기 위해 해결되었습니다. 수정 된 코드는 다음과 같습니다.

#include <string> 
#include <boost/fusion/include/sequence.hpp> 
#include <boost/fusion/include/map.hpp> 

using std::string; 

using namespace boost; 

namespace fields { 
    struct rgb; 
    struct gray; 
    struct keypoints; 
    struct edges; 
    struct objects; 
} 

typedef fusion::map< 
    fusion::pair<fields::rgb,  string>, 
    fusion::pair<fields::gray,  int>, 
    fusion::pair<fields::keypoints, int>, 
    fusion::pair<fields::edges,  int>, 
    fusion::pair<fields::objects, double> 
> Fields; 

Fields A_map; 

template<typename field> 
void Add(typename fusion::result_of::value_at_key<Fields, field>::type data) { 
    fusion::at_key<field>(A_map) = data; 
} 
+0

자신의 대답을 수락하는 것을 잊지 마십시오 (초록색 눈금 표시 사용). – llonesmiz