boost::bind에 대한 질문입니다

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

boost::bind에 대한 질문입니다

Post by 비회원 »

Code: Select all

class Test
{
public:
	void Add(int& n) { n += 10; }
	void AddPointer(int* n) { *n += 10; }
};

void TestAdd(vector<Test>& vecTest, int& n)
{
	std::for_each(vecTest.begin(), vecTest.end(), boost::bind(&Test::Add, _1, n));
}

void TestAddRef(vector<Test>& vecTest, int& n)
{
	std::for_each(vecTest.begin(), vecTest.end(), boost::bind(&Test::Add, _1, boost::ref(n)));
}

void TestAddPointer(vector<Test>& vecTest, int* n)
{
	std::for_each(vecTest.begin(), vecTest.end(), boost::bind(&Test::AddPointer, _1, n));
}
위와 같은 클래스와 함수가 있습니다.

TestAdd는 레퍼런스를 인수로 받고,
TestAddRef는 TestAdd와 같지만 인수를 boost::ref로 래핑하여 넘깁니다.
TestAddPointer는 포인터를 인수로 받는 함수이구요.

Code: Select all

	int n = 100;
	TestAdd(n);		// 1. n = 100

	n = 100;
	TestAddRef(n);	// 2. n = 110

	n = 100;
	TestAddPointer(&n);	// 3. n = 110
테스트 해 보면 위와 같은 결과가 나옵니다.
궁금한 것은 어째서 1번의 경우 boost::bind에 int 형의 인수가 넘어갔는가 하는 것입니다.
boost::ref로 래핑하지 않으면 call by value로 호출되지만,
TestAdd()의 인수가 int& 이므로 상관 없는 것 아닌가요?

사용한 컴파일러는 VS 2008 입니다.
ikpil
Posts: 98
Joined: 2008-11-12 21:17

Post by ikpil »

TestAdd의 경우 int& 로 값을 받았지만,
bind 의 템플릿 구문에서 int&로 인지하지 않고 int 로 인지 합니다.

이는 템플릿 파라미터가 레퍼런스를 인지하지 못하기 때문입니다.

왜 레퍼런스를 인지하지 못하냐? 고 물어 보신다면, 저도 잘 모르겠습니다.
비회원

Post by 비회원 »

TestAdd()는 레퍼런스로 선언되어 있지만, boost::bind()는 레퍼런스로 선언되어 있지 않기 때문입니다.
boost::bind()를 별도의 함수 호출로 보면 답이 보이실겁니다. (그래서 boost:ref가 존재합니다)
Locked