2010-05-15 4 views
1

Boost.org의 example 융합 주어진 :: 변환입니다 ".을 받고"이종 컨테이너에 boost :: fusion :: transform을 사용하는 방법은 무엇입니까? 다음과 같이

struct triple 
{ 
    typedef int result_type; 

    int operator()(int t) const 
    { 
     return t * 3; 
    }; 
}; 
// ... 
assert(transform(make_vector(1,2,3), triple()) == make_vector(3,6,9)); 

을하지만 난 아니에요 예제의 벡터는 모두 동일한 유형의 요소를 포함하지만 융합을 사용하는 주요 포인트는 이기종 유형의 컨테이너입니다. 대신 make_vector(1, 'a', "howdy")을 사용했다면 어떻게 될까요?
template<typename T> T& operator()(T& const t)

가 될하지만 어떻게 내가는 result_type를 작성합니다

int operator()(int t)
필요? template<typename T> typedef T& result_type은 확실히 유효한 문법이 아니며 함수에 묶여 있지 않기 때문에 구문이 맞지 않더라도 의미가 없습니다.

+1

남자가 거기에 넣기를 좋아하기 때문에 result_type이 필요합니까? 위의 예제에서, 그는 결과 유형을 형성하기 위해 원시 타입의 decltype을 사용하는 것처럼 보입니다. – Puppy

+0

우, 네 말이 맞아. 꼭 필요하지는 않아. 감사. 나는 boost :: fusion에 대한 실질적인 가이드를 요구하는 새로운 질문을 게시 할 예정이다. boost.org에있는이 문서는 코드 자체를 읽는 것보다 간신히 단계이다. – Kyle

답변

5

:

struct triple 
{ 
    template <typename Sig> 
    struct result; 

    template <typename This, typename T> 
    struct result<This(T)> 
    { 
     typedef /*...figure out return type...*/ type; 
    }; 

    template <typename T> 
    typename result<triple(T)>::type 
    operator()(T t) const 
    { 
     return 3*t; // relies on existing operator*() for 'T' 
    } 
}; 

은 또한, 융합에 관한 정보의 추가적인 소스는 예이며 테스트 디렉토리에서 몇 가지 기술 데모를 찾을 수 있습니다.

감사합니다 Hartmut

+0

특히, /libs/fusion/test/algorithm/transform.cpp -이 테스트 파일이 존재한다는 것을 알지 못했습니다. 감사! – Kyle

+0

'boost :: fusion :: transform'은'F'가 C++ 람다 일 때 실패한 것으로 보입니다. 이 문제가 알려진 문제입니까 아니면 제대로 호출하지 못 했습니까? –

0

통화 연산자()를 오버로드 했습니까? 대개 융합 :: 형판 (또는 다른 오버 전술 도시 -as) 함수 연산자 변환을 사용

struct triple 
{ 

    int operator()(int t) const 
    { 
     return t * 3; 
    }; 
    int operator()(string t) const 
    { 
     return t + t + t; 
    }; 
}; 
관련 문제