티스토리 뷰
개요
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
- 자료구조
- DesignPattern
- SwiftUI
- C++
- OS
- 운영체제
- Java
- rxswift
- database
- Git
- machine learing
- game
- 알고리즘
- Cocos2d-x
- SHADER
- JSP
- 국내여행
- C
- scala
- SOCKET
- 데이터베이스
- 수학
- 드라마
- swift
- C/C++
- winsock
- ios
- mongoDB
- ue4
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |