Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ reference_wrapper 완벽 가이드: 참조를 객체처럼 다루는 방법

C++의 reference_wrapper는 참조(reference)를 복사 생성 가능하고 복사 대입 가능한 객체로 감싸주는 클래스 템플릿입니다. 표준 라이브러리의 <functional> 헤더에 정의되어 있으며, 참조 자체는 컨테이너에 저장할 수 없거나 복사 의미론에서 제약이 있기 때문에 이러한 래퍼가 필요합니다.

reference_wrapper란 무엇인가?

std::reference_wrapper<T>의 인스턴스는 기본적으로 하나의 객체입니다. 하지만 내부적으로 T 타입에 대한 참조를 보관하고 있으며, 필요할 때 T&(T에 대한 참조)로 암묵적으로 변환될 수 있습니다.

덕분에 참조를 인자로 받는 함수에 그대로 전달하거나, 일반적인 참조 변수처럼 사용할 수 있습니다. 특히 다음과 같은 상황에서 유용합니다.

  • std::vector, std::array 등의 컨테이너에는 참조를 직접 저장할 수 없지만, reference_wrapper는 저장할 수 있습니다.
  • std::bind나 스레드 생성 시 객체를 값으로 복사하지 않고 참조로 전달하고 싶을 때 std::ref, std::cref와 함께 사용됩니다.

예제 코드

아래 예제는 문자 변수들을 reference_wrapper 배열로 감싼 후, 마치 일반 참조 배열처럼 순회하며 출력하는 코드입니다.

#include <iostream>
#include <functional>
using namespace std;

int main() {
    char a = 'h', b = 'e', c = 'l', d = 'l', e = 'o';
    char f = 'W', g = 'o', h = 'r', i = 'l', j = 'd';

    // 문자 변수들을 감싸는 참조 배열 생성
    reference_wrapper<char> ref[] = {a, b, c, d, e, f, g, h, i, j};

    for (char& s : ref)
        cout << s;
    cout << endl;

    return 0;
}

실행 결과

soumyadeep@soumyadeep-VirtualBox:~$ ./a.out
helloWorld
soumyadeep@soumyadeep-VirtualBox:~$

코드 해설

reference_wrapper<char> 타입의 배열 ref는 각 문자 변수에 대한 참조를 담고 있습니다. 범위 기반 for문에서 각 요소가 char&로 암묵적 변환되기 때문에 원본 문자 값을 그대로 읽어 출력할 수 있습니다. 결과적으로 "helloWorld"라는 문자열이 순서대로 화면에 출력됩니다.

정리

std::reference_wrapper는 참조의 한계(복사 불가, 컨테이너 저장 불가 등)를 우아하게 해결해 주는 도구입니다. 참조를 값처럼 복사하고 전달할 수 있게 만들어, STL 알고리즘·컨테이너·함수형 프로그래밍에서 폭넓게 활용됩니다. 참조를 유연하게 다뤄야 하는 C++ 코드를 작성할 때 꼭 기억해 두면 좋은 기능입니다.