函数调用运算符

14.34定义一个函数对象类,令其执行if-then-else的操作;该类型的调用运算符接受三个参数,它首先检查第一个形参,如果成功返回第二个参数的值;如果不成功返回第三个形参的值。

#include<iostream>
using namespace std;
class if_then_else
{
public:
    int operator()(int a,int b,int c) const
    {
        if(a)
            return b;
        else
            return c;
    }
};

int main()
{
    if_then_else f;
    cout<<f(3,4,5)<<endl;
    return 0;
}

 

14.35 编写PrintString的类,令其从istream中读取一行输入,然后返回一个表示我们所读内容的string。如果读取失败,返回空string。

#include<iostream>
#include<string>
#include<vector>
using namespace std;

class PrintString
{
public:
    PrintString(ostream &o=cout,char c=' '):os(o),sep(c) {}
    void operator()(const string &s) { os<<s<<sep;}
private:
    ostream &os;
    char sep;
};

int main()
{
    string str;
    PrintString p;
    if(getline(cin,str))
        p(str);
    else
        p(string());
    return 0;
}

14.36 使用上面定义的类读取标准输入,将每一行保存在vector的一个元素。

#include<iostream>
#include<string>
#include<vector>
using namespace std;

class PrintString
{
public:
    PrintString(ostream &o=cout,istream &i=cin,char c=' '):os(o),is(i),sep(c) {}
    void operator()(const string &s) { os<<s<<sep;}
    istream& operator()(string &s) { getline(is,s); return is;}
private:
    ostream &os;
    istream &is;
    char sep;
};

int main()
{
    vector<string> vec;
    string str;
    PrintString p;
    while(p(str))//输入
        vec.push_back(str);
    for(const auto  v:vec)
        p(v);//输出
    /*if(getline(cin,str))
        p(str);
    else
        p(string());*/
    return 0;
}

14.37编写一个类令其检查两个值是否相等。使用该对象及标准库算法编写程序,令其替换某个序列中具有给定值的所有实例。

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

class replaces
{
public:
    replaces(string s1="old",string s2="new"):oldval(s1),newval(s2) {}
    void operator()(string &s){ if(s==oldval) s=newval;}
private:
    string oldval;
    string newval;
};

int main()
{
    vector<string> vec={"old","a","old","b","old"};
    for_each(vec.begin(),vec.end(),replaces());
    for(auto v:vec)
        cout<<v<<" ";
    cout<<endl;
    return 0;
}

 

posted @ 2014-08-25 22:43  Jessica程序猿  阅读(491)  评论(0编辑  收藏  举报