C++Binder
Binder
的作用:
- 配接函数对象,形成新的函数对象
- 调用全局函数
- 针对对象、对象指针、智能对象指针调用成员函数
Binder
的用法:
用法一:当使用C++标准库预定义的函数对象时指定参数
std::palceholders::_1等表示占位符
#include <iostream>
#include <functional>
int main(void)
{
auto plus10 = std::bind(std::plus<int>(), std::placeholders::_1, 10);
std::cout << "+10 " << plus10(7) << std::endl;
auto plus10times2 = std::bind(std::multiplies<int>(),
std::bind(std::plus<int>(),
std::placeholders::_1, 10), 2);
std::cout << "+10×2 " << plus10times2(7) << std::endl;
auto pow3 = std::bind(std::multiplies<int>(),
std::bind(std::multiplies<int>(), std::placeholders::_1, std::placeholders::_1),
std::placeholders::_1);
std::cout << "x*x*x " << pow3(7) << std::endl;
auto inversDivide = std::bind(std::divides<double>(),
std::placeholders::_2,
std::placeholders::_1);
std::cout << "invdiv " << inversDivide(49,7) << std::endl;
return 0;
}
用法二:调用全局函数
#include <iostream>
#include <functional>
#include <algorithm>
#include <locale>
#include <string>
char myToupper(char c)
{
std::locale loc;
return std::use_facet<std::ctype<char>> (loc).toupper(c);
}
int main(void)
{
std::string sub("Nation");
std::string s("Internationalization");
std::string::iterator pos;
pos = std::search(s.begin(), s.end(),
sub.begin(), sub.end(),
std::bind(std::equal_to<char>(),
std::bind(myToupper, std::placeholders::_1),
std::bind(myToupper, std::placeholders::_2)));
if(pos != s.end())
std::cout << "\"" << sub << "\" is part of \"" << s << "\"" << std::endl;
return 0;
}
用法三:调用成员函数
#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
#include <string>
using namespace std::placeholders;
class Person
{
private:
std::string name;
public:
Person(const std::string& n) : name(n) {}
void print() const
{
std::cout << name << std::endl;
}
void printPrefix(const std::string& prefix) const
{
std::cout << prefix << name << std::endl;
}
};
int main(void)
{
std::vector<Person> coll = {Person("Tick"), Person("Trick"), Person("Track")};
std::for_each(coll.begin(),coll.end(),bind(&Person::print,_1));
std::cout << std::endl;
std::for_each(coll.begin(),coll.end(),bind(&Person::printPrefix,_1,"Preson: "));
std::cout << std::endl;
//打印临时变量
std::bind(&Person::printPrefix,_1,"This is ")(Person("nico"));
return 0;
}
绑定数据成员
#include <iostream>
#include <functional>
#include <algorithm>
#include <map>
#include <numeric>
#include <string>
using namespace std::placeholders;
int main(void)
{
std::map<std::string, int> coll;
coll.insert(std::make_pair<std::string, int>("a", 1));
coll.insert(std::make_pair<std::string, int>("b", 2));
coll.insert(std::make_pair<std::string, int>("c", 3));
coll.insert(std::make_pair<std::string, int>("d", 6));
//bind(&map<string,int>:value_type::second,_2)将传入的map
//的second参数绑定为元素的数据成员_2
int sum = std::accumulate(coll.begin(), coll.end(),
0,
std::bind(std::plus<int>(),
_1,
std::bind(&std::map<std::string, int>::value_type::second, _2)));
std::cout << "sum = " << sum << std::endl;
return 0;
}