#include <iostream>
#include <functional>
void foo(int& arg) { arg = 10; }
template<typename T>
void send_foo(T a)
{
foo(a);
}
int main()
{
int n = 0;
//1. 직접 참조 사용 시 문제 없음
foo(n);
std::cout << "foo() : " << n << std::endl;
n = 0;
//2-1. 전달 함수를 통해 사용 시
send_foo(n); // 받으면서 복사본 생성
std::cout << "send_foo() : " << n << std::endl;
//2-2. 포인터는 복사본은 아니지만 foo 대입 시 참조 변환 안됨 int* -> int (X) 컴파일 에러
// send_foo(&n);
//3-1. reference_wrapper : // n 을 참조로 전달하겠다는 의도.
std::reference_wrapper<int> r(n);
send_foo(r);
std::cout << "send_foo() : " << n << std::endl;
n = 0;
//3-2. std::ref(n) : reference_wrapper 를 만들어주는 함수
send_foo( std::ref(n) );
std::cout << "send_foo() : " << n << std::endl;
return 0;
}