# std::bind, std::function
std::bind ํจ์ ํ ํ๋ฆฟ์ ํจ์๋ ํจ์ ๊ฐ์ฒด๋ฅผ ๋ ์์ ์ธ์ ๋ฆฌ์คํธ๋ก ๋ฐ์ธ๋ฉํ์ฌ ์๋ก์ด ํจ์๋ ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ด๋ ๋ฏธ๋ฆฌ ์ง์ ํ ์ธ์ ๊ฐ์ด๋ ์ธ์ ์์น์ ๊ฐ์ ๊ณ ์ ์ํค๋ ๋ฐ ์ฌ์ฉ๋๋ค. std::bind๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์๋ฅผ ์ผ๋ถ ๊ณ ์ ํ๊ฑฐ๋ ์์๋ฅผ ๋ณ๊ฒฝํ์ฌ ํจ์ ํธ์ถ ์ ์ ์ฐ์ฑ์ ๋์ผ ์ ์๋ค.
std::function์ ํจ์ ํฌ์ธํฐ์ ๋น์ทํ ๊ฐ๋ ์ผ๋ก, ์คํ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ํจ์ ๊ฐ์ฒด(wrapper)์ด๋ค. ๋ค์ํ ์ข ๋ฅ์ ํจ์๋ ํจ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ณ ํธ์ถํ ์ ์์ผ๋ฉฐ, ํนํ ๋ฐํ์ ์์ ๋ค๋ฅธ ํจ์๋ ํจ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
std::bind์ std::function์ ์๋ก ๊ถํฉ์ด ์ ๋ง๋๋ค. ํนํ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ์ ์ ๋ณด์ธ๋ค.
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <vector>
double divMe(double a, double b){
return double(a/b);
}
using namespace std::placeholders;
int main(){
std::cout << std::endl;
// invoking the function object directly
std::cout << "1/2.0= " << std::bind(divMe, 1, 2.0)() << std::endl;
// placeholders for both arguments
std::function<double(double, double)> myDivBindPlaceholder= std::bind(divMe, _1, _2);
std::cout << "1/2.0= " << myDivBindPlaceholder(1, 2.0) << std::endl;
// placeholders for both arguments, swap the arguments
std::function<double(double, double)> myDivBindPlaceholderSwap= std::bind(divMe, _2, _1);
std::cout << "1/2.0= " << myDivBindPlaceholderSwap(2.0, 1) << std::endl;
// placeholder for the first argument
std::function<double(double)> myDivBind1St= std::bind(divMe, _1, 2.0);
std::cout<< "1/2.0= " << myDivBind1St(1) << std::endl;
// placeholder for the second argument
std::function<double(double)> myDivBind2Nd= std::bind(divMe, 1.0, _1);
std::cout << "1/2.0= " << myDivBind2Nd(2.0) << std::endl;
std::cout << std::endl;
}
/*
1/2.0= 0.5
1/2.0= 0.5
1/2.0= 0.5
1/2.0= 0.5
1/2.0= 0.5
*/
std::bind์ ํน์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ธ์๋ฅผ ์ํ๋ ์์น์ ๋ฐ์ธ๋ฉํ ์ ์๋ค.
- ์ธ์์ ์์๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
- ์ธ์์ ์๋ฆฌ ํ์์(placeholder)๋ฅผ ์ ์ฉํ ์ ์๋ค.
- ํจ์์ ์ผ๋ถ๋ถ๋ง ํ๊ฐํ ์ ์๋ค.
- ์๋ก ์์ฑ๋ ํจ์ ์ค๋ธ์ ํธ๋ฅผ ํธ์ถํ๊ณ std::function์ ์ ์ฅํ ์ ์๋ค.
std::function์ ์์์ ์ฝ๋ฌ๋ธ(ํจ์ ํํ์ ํธ์ถ์)์ ๋ณ์์ ์ ์ฅํ ์ ์๋ค. ์ฝ๋ฌ๋ธ์ ์ผ๋ฐ ํจ์๋ฟ๋ง ์๋๋ผ ๋๋ค ํจ์ ํน์ ํจ์ ์ค๋ธ์ ํธ์ผ ์๋ ์๋ค.
#include <cmath>
#include <functional>
#include <iostream>
#include <map>
int main(){
std::cout << std::endl;
// dispatch table
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;}));
// do the math
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;
// add a new operation
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::cout << std::endl;
};
/*
3.5 + 4.5= 8
3.5 - 4.5= -1
3.5 * 4.5= 15.75
3.5 / 4.5= 0.777778
3.5 ^ 4.5= 280.741
*/
'ํ๋ก๊ทธ๋๋ฐ ์ธ์ด > C++ ์์ฉ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[STL] ์ค๋งํธํฌ์ธํฐ(std::unique_ptr, std::shared_ptr, std::weak_ptr) (0) | 2023.08.05 |
---|---|
[STL] std::tuple, std::make_tuple, std::tie, std::ignore (0) | 2023.08.04 |
[STL] utility : minmax, move, forward, swap (0) | 2023.06.04 |
vcpkg๋ฅผ ์ฐ์ (0) | 2023.03.19 |
std::thread์ std::async (0) | 2023.01.14 |
๋๊ธ