posts - 58,  comments - 75,  trackbacks - 0
    仿函数就是使对象使用行为看上去像个函数。
    函数的使用是这个样的
    Function(param1,param2,...)
    而对象的使用是这个样的
    Object.memberfunction(param1,param2...)
    而仿函数对象的使用是这个样的
    Object(param1,param2,...)
    这样我们可以看出,从外表上看,仿函数对象和函数是一个东西。呵呵,当然他们是不同的。他们一样不过是在使用的外形上一样罢了。

    一个仿函数类如下定义
    class ObjectFunction
    {
        .......
        public:
            返回的类型 operator() ([param1,param2,...]);
     };

     例1
     class ObjectFunction1
     {
          .......
          public:
              void operator() () { count << "No Param ObjectFuntion" << endl;
      };

      例2
      class ObjectFunction2
      {
           ........
           public:
               bool operator() (int x)
               {
                   count << "Have Param ObjectFuntion" << endl;
                   count << "This is ObjectFuntion's Param" << x << endl;

                   return true;
                }
         }

         仿函数的关键是要实现 operator() 运算符。
     
posted on 2006-03-23 23:22 walkspeed 阅读(5697) 评论(7)  编辑 收藏 引用

FeedBack:
# re: 何为仿函数
2006-03-24 09:03 | 沐枫
仿函数和函数毕竟还是不同的。
比如上面的ObjectFunction2,你在调用时应该是:

ObjectFunction2()(10);
这和函数

func(10);
区别还是挺大的。

  回复  更多评论
  
# re: 何为仿函数
2006-03-24 10:30 | walkspeed
呵呵,可以不用那么的麻烦的。
直接调用就可以了。
你可以试一试。  回复  更多评论
  
# re: 何为仿函数
2006-03-24 11:06 | 沐枫
d:\test\ttttt\ttttt\ttttt.cpp(25) : error C2440: '<function-style-cast>' : cannot convert from 'int' to 'f'
No constructor could take the source type, or constructor overload resolution was ambiguous

-------------------Source-------------
#include <iostream>
using namespace std;

class f{
public:
void operator()(int x) {
cout << x << endl;
}
};

int _tmain(int argc, _TCHAR* argv[]) {
f(10);//Error 2440
f()(10);//OK

system("Pause");
return 0;
}
  回复  更多评论
  
# re: 何为仿函数
2006-03-24 15:03 | walkspeed
你的错误我看到了。

你没有先创建一个仿函数类的对象,就直接使用了类。这是不行的。
仿函数类毕竟是个类,要先创建一个对象的。

你使用成功的那个方法,其实先创建了一个无名的对象,然后才调用operator()操作的。

所以并不是仿函数对象的用法是那个样。  回复  更多评论
  
# re: 何为仿函数
2006-03-24 17:08 | 沐枫
“呵呵,可以不用那么的麻烦的。 直接调用就可以了。 你可以试一试。” --@ walkspeed

--我试了,证明是一定要麻烦点,需要多加个括号。
  如你自已的代码中:ObjectFunction2()(10);而不能ObjectFunction2(10)。而函数就可以。
  不知道你所谓的不用那么麻烦,是如何做到的。

我不是不懂什么对象构造仿函数什么的。只是说,仿函数毕竟不是函数,不能直接调用,这一点和函数是有差别的。  回复  更多评论
  
# re: 何为仿函数
2006-03-24 19:46 | walkspeed
呵呵。首先先感谢你的关注。

我现在明白你的意思了。

其实仿函数的真正的价值不在它可以象函数那样的操作行为。  回复  更多评论
  
# re: 何为仿函数
2008-11-21 09:50 | Torres
本来想说点儿什么,一看是2006的立即囧了,Orz~~~,学习了一下,自己还是太弱了  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(4)

随笔分类(64)

随笔档案(58)

文章分类(3)

文章档案(3)

相册

收藏夹(9)

C++零碎

好友

搜索

  •  

积分与排名

  • 积分 - 159887
  • 排名 - 163

最新评论

阅读排行榜

评论排行榜