2013-08-23 2 views
1

C++ 11을 사용하지 않습니다. 그렇지 않으면 lambdas를 사용합니다.펑터를 연결/대기열로 만드는 방법은 무엇입니까?

입력 데이터 구조와 출력 데이터 구조에 대한 반복자가 있습니다. 입력 데이터에 대해 몇 가지 작업을 수행하고 그 결과를 출력에 저장하려고합니다. 시작 유형과 끝 유형은 다를 수 있습니다 (예 : int -> float).

나는 표준 알고리즘 후 제 기능을 모델링하기 위해 노력하고 다음 프로토 타입

template<class INPUT_ITR, OUTPUT_ITR> 
void f(INPUT_ITR in_it, INPUT_ITR in_it_end, OUTPUT_ITR out_it, ContextStuff) 

기능은 상황에 따라 여러 가지 일을했다. 때로는 기능은 하나의 펑터를 사용해야하므로 코드의 라인이

transform(in_it, in_it_end, out_it, Functor1()); 

처럼 보인다하지만 가끔은 함수가 각 데이터 요소에 펑 시리즈를 사용하고 싶어. 변환에 사용할 단일 펑터로 펑터 체인을 만들 수있는 방법이 있습니까? 체인의 펑터는 컴파일 유형으로 알려집니다. 예에

transform(in_it, in_it_end, out_it, CHAIN(Functor1(), Functor2())); 

수행합니다 Functor1 * 옵션

결과에 다음 Functor2 다음 점포 * 아웃.

솔루션의 unary_function에서 내 펑터를 상속 할 수 있습니다.

+0

사용자 지정 펑터를 만드는 것이 더 나을지도 모릅니다. 정말 마음에 떠오르는 것이 없지만 Boost에는 몇 가지 트릭이있을 것입니다. – chris

+0

C++ 11 없이는 functor의 협조없이 functor의 결과 타입을 얻을 수 없습니다 (일반적으로'result_type'). 그래서 이것을 원한다면 모든 펑터는'result_type' typedef를 가져야합니다. – Fozi

+0

@Fozi 솔루션에 대한 unary_function에서 내 펑터를 상속받을 수 있습니다. –

답변

2

이 시도 :

template<class Callable1, class Callable2> 
struct Chain : public std::unary_function< 
    typename Callable2::argument_type, typename Callable1::result_type> 
{ 
    Chain(const Callable1 &f1, const Callable2 &f2) : f1(f1), f2(f2) {} 

    typename Callable1::result_type operator() (
      typename Callable2::argument_type param) 
    { 
     return f1(f2(param)); 
    } 
private: 
    Callable1 f1; 
    Callable2 f2; 
}; 

template<class Callable1, class Callable2> 
Chain<Callable1, Callable2> chain(const Callable1 &f1, const Callable2 &f2) { 
    return Chain<Callable1, Callable2>(f1, f2); 
} 

체인 클래스는 다른 두 펑터를 결합하는 펑터이다. unary_function이므로 더 이상 결합 할 수 있어야합니다. chain 함수를 사용하면 유형에 대해 걱정할 필요없이 Chain 인스턴스를 만들 수 있습니다.

사용 예 : http://ideone.com/7QpmEU

+0

operator()는 const 여야하며 그 외에도 괜찮습니다. –

+0

@WernerErasmus f1과 f2의 연산자는 const가 아닐 수 있습니다. 합계를 계산하거나 호출 횟수를 계산하는 펑터를 상상해보십시오. 그러나 그렇습니다. 대부분의 경우 const가되어야합니다. – Fozi

+0

귀하의 요지를 봅니다. 그럼에도 불구하고 non-const로 만들면 알고리즘이 알고리즘을 복사하게됩니다. 그렇지 않으면 나는 적어도 const를 통해 Chain이 전달 될 때 overload를 고려할 것이다. 또는, 호출 op()가 Chain의 논리적 상태를 변경하지 않는다고 주장하면서, 변경 가능하게 만든다. (사용자가 결과를 얻을 방법이 없기 때문에 true 또한 누적과 같은 알고리즘은 연산의 반환 값을 사용합니다. –