为StrBlobPtr编写解引用运算符*和箭头运算符.注意箭头运算符只能返回一个指针或者一个重载了箭头运算符的对象.
string& operator*()const { auto p = check(curr, "deference past end"); return (*p)[curr]; }//返回所指string的引用
string* operator->()const { return &operator*(); }//返回一个指针
定义一个指向StrBlobPtr的类,并编写新的-〉符号
class ToStrBlobPtr
{
public:
StrBlobPtr& operator*(){
if(Sp) return *Sp;//如果指向某个StrBlobPtr,返回它
else return StrBlobPtr();//返回一个空的StrBlobPtr
}
StrBlobPtr* operator->(){ return &operator*(); }
private:
StrBlobPtr* Sp;
};
===========================================
函数调用运算符(),让我们可以像使用函数一样使用该类的对象.
[练习]:定义一个函数对象类,接受三个参数,首先检查第一个形参,如果成功返回第二个,否则返回第三个.
class If_Else
{
public:
size_t operator() (size_t i, size_t j, size_t k){
return i ? j : k;
}
};
编写一个类检查某个值是否等于给定值,并利用它替换某个序列中所有给定值.
class Is_Equal
{
public:
Is_Equal(int n = 0) :value(n){}
bool operator()( const int &a)const{ return a == value;}
private:
int value;
};
int main()
{
const Is_Equal test(10);
vector<int> vec(100);
iota(vec.begin(), vec.end(), 1);
vec.resize(120, 10);
replace_if(vec.begin(), vec.end(), test,0);
for_each(vec.begin(), vec.end(), [](int x){cout<<x<<" "; });
return 0;
}
利用标准库函数对象与函数适配器(bind绑定)定义一条表达式令其将所有值乘2;
transform(vec.begin(), vec.end(),vec.begin(),bind(multiplies<int>(), _1, 2));
利用标准库函数对象判断一个给定的int是否被所有int容器的元素整除.
modulus<int> T;
vector<int>vec{ 1, 2, 3, 4, 5 };
int n = 1;
auto test = all_of(vec.begin(), vec.end(), [&](int x){return !T(x,n); });