2013-04-10 3 views
4

대부분 알다시피 standard collection of references을 가질 수 없습니다. 또한 스트림 객체를 복사 할 수도 없습니다.스트림 개체 컬렉션을 만드는 방법

그러나 스트림 객체 또는 스트림 객체 참조의 콜렉션 (예 : std::vector)을 만들고 싶다면 어떻게해야합니까?

예를 들어 스트림 객체 참조를 래핑 할 수 있다는 것을 알고 있습니다. 구조체를 만들지 만, 완성 된 인터페이스를 구현해야한다 (래퍼를 직접 스트림으로 사용하고 싶다면 선호한다). 또는 공개 getter 함수를 사용하여 어디서나 실제 스트림을 얻는다.

더 간단한 방법이 있습니까? C++ 11 솔루션은 괜찮습니다.

+0

왜 포인터 모음을 사용하지 않습니까? – riv

+0

또는 스마트 포인터를 자동으로 파괴해야하는 경우 스마트 포인터 컬렉션? – nob

+2

'std :: reference_wrapper '콜렉션은 어떨까요? – juanchopanza

답변

7

참조 컨테이너는 가질 수 없지만 컨테이너는 std::reference_wrapper입니다. 당신은 매우 참조 같은 std::reference_wrapper을 처리 할 수 ​​

std::vector<std::reference_wrapper<stream_type>> v; 

(사실,이 참조 형식에 암시 적으로 변환입니다)하지만, 개체 유형 인의 추가 이점이있다 : 아마 당신은 같은 것을 원하는.

+0

+1 내 생각을 정확하게! – juanchopanza

+0

그냥 테스트하고 잘 작동합니다. 예를 들어, 직접 사용 된 경우 참조 된 스트림을 가져 오기 위해 여전히 'get'함수를 사용해야합니다. 출력 또는 입력 작업을 수행하지만 다른 기능으로 넘어갈 때는 수행하지 않습니다. 나는 그걸로 살 수있다. –

0

당신은 컬렉션에 비 복사 가능한 개체를 사용할 수 있습니다 :

// this uses move constructors 
std::vector<std::fstream> v {std::fstream{"file1.txt"}, std::fstream{"file2.txt"}}; 

// this doesn't require the type to even be movable 
v.emplace_back("file3.txt"); 

당신이 다형성 객체로 스트림을 사용할 필요가없는 경우 포인터 및 참조와 같은 유형이 방법을 피하는에만 작동합니다 있지만.

관련 문제