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 입니다.