Page 31 -
P. 31
2.2.2 std::function
10
std::function 은 임의의 콜러블을 변수에 저장할 수 있으며, 일종의 다형 함수 래퍼(polymorphic
function wrapper)라고 볼 수 있다. 이때 콜러블은 람다 함수일 수도 있고, 함수 오브젝트나 함수일 2
수도 있다. 콜러블의 타입을 구체적으로 지정해야 한다면 std::function을 반드시 써야 하고 auto
로 교체할 수 없다. 유틸리티
std::function을 이용한 디스패치 테이블
// dispatchTable.cpp
...
#include <functional>
...
int main(){
...
// 디스패치 테이블
std::map< const char , std::function<double(double, double)> > dispTable;
dispTable.insert( std::make_pair('+', [](double a, double b){ return a + b;}));
dispTable.insert( std::make_pair('-', [](double a, double b){ return a - b;}));
dispTable.insert( std::make_pair('*', [](double a, double b){ return a * b;}));
dispTable.insert( std::make_pair('/', [](double a, double b){ return a / b;}));
// 연산을 수행한다
std::cout << "3.5 + 4.5= " << dispTable['+'](3.5, 4.5) << std::endl;
std::cout << "3.5 - 4.5= " << dispTable['-'](3.5, 4.5) << std::endl;
std::cout << "3.5 * 4.5= " << dispTable['*'](3.5, 4.5) << std::endl;
std::cout << "3.5 / 4.5= " << dispTable['/'](3.5, 4.5) << std::endl;
// 새로운 연산자를 추가한다
dispTable.insert( std::make_pair('^', [](double a, double b){ return std::pow(a, b);
}));
std::cout << "3.5 ^ 4.5= " << dispTable['^'](3.5, 4.5) << std::endl;
...
std::function의 타입 매개변수는 std::function이 받을 콜러블 타입을 지정한다.
10 http://en.cppreference.com/w/cpp/utility/functional/function
47
c++_06.indd 47 2021-11-19 오전 9:25:46