c/c++ 過載運算子 標準庫function的用法
阿新 • • 發佈:2018-12-25
過載運算子 標準庫function的用法
問題:int(int, int)算不算一種比較通用的型別??
比如函式: int add(int a, int b);
比如lambda:auto mod = [](int a, int b){return a % b};
比如函式物件類:int operator()(int a, int b);
上面3個的共同特徵就是:int(int, int),但是如何讓上面的3種形式變成共同的的呢???
答案:使用function類。
std::function<int(int, int)> f1 = add; std::function<int(int, int)> f2 = mod; std::function<int(int, int)> f3 = divide(); std::cout << f1(1,2) << std::endl; std::cout << f2(4,3) << std::endl; std::cout << f3(6,2) << std::endl;
例子:假設某些處理的,引數永遠是2個int,返回值永遠是int,想把這些處理放到一個函式表裡,比如方到std::map裡。
#include <functional> #include <map> #include <iostream> int add(int a, int b){ return a+ b; } auto mod = [](int a, int b){return a % b;}; struct divide{ int operator()(int a, int b){ return a / b; } }; int main(){ /* std::map<std::string, int(*)(int, int)> mp; mp.insert({"+", add}); mp.insert({"%", mod}); divide dv; mp.insert({"/", divide()});//bian yi bu guo std::function<int(int, int)> f1 = add; std::function<int(int, int)> f2 = mod; std::function<int(int, int)> f3 = divide(); std::cout << f1(1,2) << std::endl; std::cout << f2(4,3) << std::endl; std::cout << f3(6,2) << std::endl; */ std::map<std::string, std::function<int(int, int)>> mp; mp.insert({"+", add}); mp.insert({"-", std::minus<int>()}); mp.insert({"*", [](int a, int b){return a * b;}}); mp.insert({"%", mod}); mp.insert({"/", divide()}); std::cout << mp["+"](1, 2) << std::endl; std::cout << mp["-"](3, 2) << std::endl; std::cout << mp["*"](2, 2) << std::endl; std::cout << mp["/"](100, 2) << std::endl; std::cout << mp["%"](31, 15) << std::endl; }