- 使用函数对象效率高(大多数编译器不会针对函数指针执行的函数进行内联优化,即时加了inline)
- 让你的正确正确被编译
- 这样有助于避免一些微妙的、语言本身的缺陷
在新的编译器下,后两条用函数一样是正确的。
书中例,将一个集合中每一个字符串对象长度输出到cout中,是可以通过编译并且运行的:(我用的是支持C++11的编译器,可能以前老版本的不行)
std::set<std::string> s = {"hello","world","hi"};
transform(s.begin(),s.end(),
std::ostream_iterator<std::string::size_type>(std::cout,"\n"),
mem_fun_ref(&std::string::size));
当一个模板实例化名称不完成等同于一个函数的名称时,一样可以通过编译:
template<typename InputIter1,typename InputIter2>
void wirteAverages(InputIter1 begin1,InputIter1 end1,
InputIter2 begin2,ostream& s)
{
transform(begin1,end1,begin2,
ostream_iterator<typename iterator_traits<InputIter1>::value_type>(s,"\n"),
average<typename iterator_traits<InputIter1>::value_type>); //错误
}
用函数对象替换:
template<typename InputIter1,typename InputIter2>
void wirteAverages(InputIter1 begin1,InputIter1 end1,
InputIter2 begin2,ostream& s)
{
transform(begin1,end1,begin2,
ostream_iterator<typename iterator_traits<InputIter1>::value_type>(s,"\n"),
Average<typename iterator_traits<InputIter1>::value_type>());
}