重載運算符 標準庫function的用法 問題:int(int, int)算不算一種比較通用的類型?? 比如函數: int add(int a, int b); 比如lambda:auto mod = \ "" {return a % b}; 比如函數對象類:int operator()(int a ...
重載運算符 標準庫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;
}
有個麻煩的情況,例如有2個名字都叫add的方法。
int add(int a, int b){
return a+ b;
}
double add(double a, double b){ return a + b;}
mp.insert({"+", add});
當mp.insert({"+", add});的時候,編譯器無法通過名字確定是哪個方法,怎麼辦???
使用函數指針消除二義性。
int(*add1)(int, int) = add;
double(*add2)(double, double) = add;
mp.insert({"+1", add1});
mp.insert({"+2", add2});