2014-10-11 2 views
2

내가 하스켈과 일반적으로 기능적인 언어로 많은 일을 한 후 C++를 배우고, 그리고 내가 지속적으로 같은 문제를 해결하기 위해 노력하고 있음을 발견C++에서 사용자 정의 스트림 변환을 작성하려면 어떻게해야합니까?

  • 이 입력 스트림에서 일부 데이터를 읽기를
  • 들이 특정 알고리즘을 기반으로 토큰 화
  • 프로세스 토큰

이 하스켈 인 경우, 단순히 모든 게으른이라는 사실을 활용 수 있고, 그것에 대해 생각하는 나의 변화를 작성한 다음 그것은 g가 될 것이다. 다운 스트림이 소비됨에 따라 적용된다. 이 정확한 패턴 (conduitpipes)을 수행하는 라이브러리조차 있습니다.

시퀀스 1 2 3 4 5 6 ...을 출력하고 12 34 56 ...을 출력한다고 가정 해 보겠습니다. 스트림에서 작동하고 해당 위치에서 데이터를 처리하는 임시 코드를 작성하는 방법을 볼 수 있습니다. 그러나 다른 스트림에서 데이터를 (생각할 수있는 방식으로) 변형하여 새 스트림을 만들 수있는 추상화 메커니즘이있는 경우 을 알고 싶습니다.이 추상화는 하나의 요소를 새로운 값으로 간단히 매핑하는 것이 아니라 처리 할 때 데이터를 버퍼링 할 수 있어야합니다.

다음은 제한 사항 :

  • 내가 다음 stdlib 이외의 다른 라이브러리를 사용할 수 없습니다.
  • 그것은 C++ 03에서 작동하는 (어떤 C++ 11 기능을 의미하지 않습니다.)

당신이 생각하는 경우 이는 숙제가? 음, 나는 데이터 스트림으로 작업해야하는 많은 클래스 할당을 얻고있다. (이는 라이브러리가없고, C++ 03 제한 인 의 이유이다). 그것은 내가 루프를 사용하여 while 루프를 사용하여 이것을 어떻게 해야할지 모르겠지만, 난 그냥 stl에 기존의 스트림 추상화가 있다면, 그냥 발견하고 사용 기다리고 싶습니다.

그러나이 작업을 수행하는 유일한 방법은 C++ 11을 사용하는 것이지만 알고 싶습니다.

+0

내가 알고있는 기성품 패키지가 없습니다. 아마도'std :: istream_iterator'와 함께 사용되는 커스텀 클래스 타입일까요? –

+0

@ T.C. 흠, 그게 내가 원하는거야. 내가 올바르게 이해한다면 입력 스트림을 필요로하는 출력을 생성하는 커스텀 반복자를 구현할 것입니다. 하나의 이터레이터를 사용하여 다른 이터레이터를 만들고 싶다면 (컴포지션을 생각해보십시오) 어떻게해야합니까? –

+0

['std :: istream_iterator'] (http://en.cppreference.com/w/cpp/iterator/istream_iterator)와 함께 사용되는 사용자 정의 스트림 추출 연산자가있는 클래스에 대해 생각하고있었습니다. 컴포지션에 관해서는, 당신 자신의 반복자 어댑터를 작성해야합니다. –

답변

0

개념 코드, 테스트되지 않았습니다. 이미징에는 많은 오류 검사와 올바른 구문이 있습니다.

struct add : public std::binary_function<int,int,int> { 
    int operator() (int a, int b) {return (a + b);} 
}; 

template<typename inType, typename dType, typename outType, class binFunc> 
outType Transformer(inType& inStream, outType& outStream, binFunc func) { 
    dType a, b; 
    // Read some data from an input stream 
    // Tokenize them based on a specific algorithm 
    inStream>> a >> b; 
    //outStream << func(a, b); 
    return func(a,b); // Process the tokens 
} 

int main() { 
    std::ifstream in("input.dat", std::ifstream::in); // , std::ios::binary 
    std::ofstream out("output.dat"); 
    struct add adder; // to Process the tokens 

    out << Transformer(in, out, adder); 

    return exit_success; 
} 
0

다음은 라이브러리가 필요없는 솔루션의 필요성에 맞지 않습니다 (그리고 나는 평판이 좋지 않아 의견을 남기지 못합니다). 그러나, 그것은 당신의 기능적인 사고 방식에 편리 할 것입니다.

데이비드 상켈 (David Sankel)은 C++ Now 2014에서 C++을 사용하여 FRP에 관한 훌륭한 강연을했습니다. 그는 제작을 위해 사용하는 라이브러리도 제공했습니다.

비디오

는 여기에서 찾을 수 있습니다 : https://www.youtube.com/watch?v=tyaYLGQSr4g&list=UU5e__RG9K3cHrPotPABnrwg

슬라이드는 슬라이드의 끝 부분에있는 동영상 설명 및 GitHub의 링크에 연결되어 있습니다.

난 당신이 여기에서 영감을 얻을 것이다 의심 : http://ericniebler.com/2013/11/07/input-iterators-vs-input-ranges/

표준 : 주로 당신이 필요로하는 무엇을 어떻게해야 스트림 반복자로 변환.

관련 문제