조나단 보 카라 (저자 Fluent C ++의 )는 pipes 라는 라이브러리를 작성했습니다 .
리포지토리의 메인 페이지 인이 “파이핑 (piping)”은 비록 똑같아 보이더라도 범위를 사용하는 것과는 다릅니다. 그러나 그것은 범위 라이브러리를 사용하여 다양한 ‘파이프’작업을 수행 할 수는 없다고 언급 되어 있습니다. 예를 들면 다음과 같습니다.
- 압축 풀기-압축 된 입력-본질적으로 k- 튜플 범위-k 개의 독립적 인 출력을 생성합니다.
- fork-컨테이너 / 범위의 여러 (독립) 사본을 생성합니다.
원칙적으로 왜 그런지 잘 모르겠습니다. (물론 엔드 이터레이터 / 센티넬을 얻을 수없는 범위는 예외입니다.)
답변
논의되는 것은 본질적으로 푸시 기반 처리 방법과 풀 기반 방법의 차이점입니다. 이 파이프 라이브러리와 같은 푸시 시스템에서 처리 체인을 설정하고 각 처리 단계에서 데이터를 다음으로 직접 푸시합니다. 범위와 같은 풀 시스템에서는 필요에 따라 액세스하고 수정할 수있는 데이터 표현을 설정합니다. 처리 자체는 일어나지 않습니다. 누군가가 범위를 소비하려고 할 때만 발생합니다.
unzip
및 fork
작업은 모두 일대 작업입니다 : 그들은 하나의 입력을 받아 많은 처리 작업에 매핑.
푸시 시스템으로서, 파이프 라이브러리는 API 구조로 인해 일대 다 조작을 처리 할 수 있습니다. 작업은 함수 호출로 표현됩니다. 입력은 사용 지점 ( >>=
프로세서를 사용 하거나 프로세서에 전달)에 의해 암시됩니다 . 함수의 매개 변수는 출력을 정의합니다 (프로세서 자체에 대한 매개 변수는 무시). 그리고 C ++ 함수는 임의의 수의 매개 변수를 가질 수 있으므로 일대 다 매핑 작업이 자연스럽게 발생합니다. 다양한 출력에 적합한 프로세서를 제공하기 만하면됩니다.
풀 시스템으로서 범위는 반환 값을 기준으로합니다. C ++에는 여러 값을 반환하는 언어 메커니즘이 없으므로 여러 값을 나타내는 “값”을 반환하는 것이 가장 좋습니다.
그러나 범위 어댑터 체인은 궁극적으로 입력 범위 에 기반 합니다 . “여러 값을 나타내는 ‘값'” 자체 는 범위 가 아닙니다. 범위가 포함될 수 있지만 범위가 아닙니다.
따라서 이제는 “범위가 아닌”유형을 사용하여 모든 범위 어댑터가 작동하도록해야합니다. 범위 어댑터를 적용하면 유형 전체에서 해당 작업을 브로드 캐스트하여 다 대다 작업을 만들어야합니다. 그렇게하는 것은 쉽지 않습니다.
그러나 더 중요한 것은 … 아마도 당신이 원하는 것이 아닐 것입니다 . 당신이 경우 fork
범위는, 당신은 거의 확실하게 복제 된 범위에 다른 처리를해야합니다. 그리고 그 |
작업을 수행 할 수있는 기회를 완전히 종료 합니다. 이러한 범위 튜플의 특정 부분에 어댑터를 적용하는 방법을 만들어야합니다. 그리고 이러한 방식은 점차 푸시 기반 프로세서처럼 보일 것입니다.
하루가 끝나면 풀 스타일 시스템에는 각 레벨에서 하나의 출력 만 있습니다. 이는 이러한 API의 핵심 개념 중 일부일뿐입니다. 각 처리 단계 는 범위를 생성 합니다 . 이는 장점 (지연 처리)을 갖지만 일대 다 작업을 나타내는 것이 약한 영역 중 하나입니다.
범위는 확실히 unzip
기능을 가질 수 있습니다 ( fork
실제로는 범위를 복사하는 것입니다). 그러나 |
스타일 어댑터 는 아닙니다 . 일부 분해 가능한 유형에 대해 범위를 취하고 범위의 튜플을 리턴하는 함수입니다. 더 많은 처리를 원한다면 튜플을 값으로 저장하고 개별 요소에 액세스 한 후 적절하게 사용해야합니다.