티스토리 뷰

Programming/C++

C++11 - std::bind

글그리 2017. 9. 21. 15:56

개요

C++ 11에 추가된 bind라는 것을 알아보자.

bind는 C++이 함수형 프로그래밍을 할 수 있도록 도와주는 기능으로, 함수를 변수처럼 사용하거나 함수의 특정 파라미터를 고정시킨 새로운 함수를 생성할 수도 있게 해준다.

std::bind

일단 기본적인 bind 방법은 다음과 같다.

#include <iostream>
#include <functional>

int Calc(int a, int b, int c)
{ 
    return (a + b) * c;
}

int main(int argc, char* argv[])
{ 
    auto bindedCalc = std::bind(Calc, 3, 4, 5); 
    std::cout<<bindedCalc()<<endl;  // >35 
    return 0;
}

이처럼 매개변수를 고정시켜서 새로운 함수로 만들어질 수 있다. 이 때 반환되는 자료형은 std::function으로 함수를 해당 함수를 가리키는 포인터 변수이다. 따라서 이 변수를 여기저기 넘겨주면서 Calc함수를 자유자재로 사용할 수 있다.

Calc의 매개변수를 모두 고정하지 않고 특정 매개변수만 고정한 채로 사용하려면 std::placeholder를 사용하면 된다.

std::placeholders

예를 들어 3개의 int값 a, b, c를 받아서 (a + b) * c를 반환하는 함수 Calc가 있다고 하자. 그런데 이 함수를 특정 연산을 수행할 때 a값이 고정된 값 5만 대입된다면, a에 고정된 값을 bind시키고, 나머지 b, c를 placeholder로 두어 필요한 값을 대입해서 쓸 수 있도록 할 수 있다.

#include <iostream>
#include <functional>

int Calc(int a, int b, int c)
{ 
    return (a + b) * c;
}

int main(int argc, char* argv[])
{ 
    auto curriedCalc = std::bind(Calc, 5, std::placeholders::_1, std::placeholders::_2); 
    cout<<curriedCalc(6, 7)<<endl;  // >77 
    return 0;
}

placeholders:: 뒤에 있는 숫자는 몇번째 파라미터인지를 나타내는 숫자이다. 때문에 같은 기능을 하는 코드도 다른 모습으로 작성할 수도 있으며, 입력하는 파라미터의 순서를 원하는대로 변경할 수도 있다.

int main(int argc, char* argv[])
{ 
    auto curCalc = std::bind(Calc, 5, std::placeholders::_2, std::placeholders::_3); 
    auto xCalc = std::bind(Calc, 5, std::placeholders::_2, std::placeholders::_1); 
    cout<<curCalc(std::placeholders::_1, 6, 7)<<endl;  // >77 
    cout<<xCalc(6, 7)<<endl;  // >72 
    return 0;
}

위 코드에서 curCalc는 그 위에 있는 코드에 있는 curriedCalc와 같은 동작을 하지만 표현 방법이 다르며, xCalc는 매개변수의 순서를 바꿔서 같은 매개변수를 대입해도 다른 결과가 나오는 것을 볼 수 있다.

마치며

함수형 프로그래밍 언어인 스칼라(scala)를 공부하고 나니 이 새로운 기능들을 더 잘 이해할 수 있었다. callback함수를 만들 때 말고는 아직 어디에 사용해야 할 지 모르겠다.

'Programming > C++' 카테고리의 다른 글

C++ - 메모리 생성  (0) 2017.12.30
c++11 - std::shared_ptr로 thread safe callback 구현하기  (0) 2017.11.19
콜백함수 만들기 : 함수 포인터(Function Pointer)  (0) 2017.02.05
C/C++ - sscanf, sscanf_s  (0) 2017.01.23
C/C++ - assert  (0) 2016.12.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함