Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

2014 07 10 바인더

krikit edited this page Nov 26, 2014 · 1 revision

바인더

std::bind를 이용하면 함수의 특정 파라미터를 지정하거나 파라미터의 순서를 바꾸는 등 새로운 함수 포인터를 생성하여 마치 매크로처럼 함수를 호출할 수 있습니다.

void func(int num, const string& str);

std::string str = "123";
// bind된 함수 f1()의 첫번째 인자는 func()의 첫번째 인자로, 두번째 인자는 str 변수로 고정
auto f1 = std::bind(func, std::placeholders::_1, str);
f1(123);    // func(123, str)과 동일

// bind된 함수 f2()의 첫번째 인자와 두번째 인자를 서로 바꿔서 func()를 호출
auto f2 = std::bind(func, std::placeholders::_2, std::placeholders::_1);
f2("321", 321);    // func(321, "321")과 동일

바인더는 이럴 때 유용합니다. 예를 들어, 점수 벡터에서 100점을 추려내기 위해 find_if() 함수와 greater_equal functor를 사용하고 싶은데, 문제는 greater_equal에서는 인자를 두개를 받도록 되어있다는 것입니다. 아래 코드를 보시면 이해하실 수 있습니다.

std::find_if(vec.begin(), vec.end(), std::bind(std::greater_equal<int>(), std::placeholders::_1, 100));

C++11 이전에는 std::bind1st와 std::bind2nd를 사용해야 합니다. 이들은 두개의 인자를 받는 함수에 대해 첫번째 혹은 두번째 인자를 지정해 줘서 인자를 하나만 받는 함수로 바인딩 해주는 것들입니다.

std::find_if(vec.begin(), vec.end(), std::bind2nd(std::greater_equal<int>(), 100));    // x >= 100

그러나, 이렇게 어렵게 하는 것 보다 C++11에서는 람다 함수를 쓰는 것이 직관적입니다. ^^;

std::find_if(vec.begin(), vec.end(), [](int score){ return score >= 100; });

Clone this wiki locally