14.8 函数调用运算符
重载了函数调用运算符的类,它的对象可以做出像函数 一样的行为,因此我们称这样的对象为函数对象。
相对于普通的函数,函数对象可以保存一些状态,这些状态其实就是他的数据成员。
这其实就又和lambda表达式一样了,lambda表达式编译之后其实就是生成一个类,然后再生成一个类的对象。
练习
14.33
零个,一个,多个都可以,而且参数可以有默认值
14.34
struct IfThenElse
{
int operator()(int a,int b,int c) {
return a ? b : c;
};
};
14.35
这里的函数对象是有状态的,保存了is
struct ReadString {
ReadString(istream& _is):is(_is){
};
string operator()() {
string temp = "";
getline(is, temp);
return temp;
};
istream& is;
};
14.36
ReadString read_string(cin);
string line;
vector<string> vec;
while ((line=read_string())!="") {
vec.push_back(line);
}
ostream_iterator<string> out_iter(cout,",");
std::copy(vec.begin(), vec.end(), out_iter);
14.37
也可以将target写成数据成员
struct TwoValueEqual
{
bool operator()(const string&str1,const string& target) {
return str1 == target;
};
};
ReadString read_string(cin);
string line;
vector<string> vec;
while ((line = read_string()) != "") {
vec.push_back(line);
}
ostream_iterator<string> out_iter(cout,"\n");
std::copy(vec.begin(), vec.end(), out_iter);
TwoValueEqual func;
auto new_func = std::bind(func, std::placeholders::_1, "123");
//new_func("23");
std::replace_copy_if(vec.begin