[问题] 请教operator()的意义

楼主: Keitaro (动き出す时间...)   2014-11-22 17:36:16
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC2008/2013
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
MFC
问题(Question):
请教operator()的意义
程式码(Code):(请善用置底文网页, 记得排版)
// 建立自订的struct object
struct SiteInfo
{
CString SiteName;
int SiteID;
SiteInfo(CString name, int ID)
{
SiteName = name;
SiteID = ID;
}
};
// Functor
struct FindSiteByID
{
int SiteID;
FindSiteByID(int ID)
{
SiteID = ID;
}
bool operator()(SiteInfo& info)
{
return (SiteID == info.SiteID);
}
};
// 利用Functor在vector中找到自己要的东西
void FindSite(int SiteNum)
{
std::vector<SiteInfo> test_vector;
test_vector.clear();
for (int i = 1; i <= 10; i++)
{
CString name;
name.Format(_T("Site%d"), i);
test_vector.push_back(SiteInfo(name, i));
}
std::vector<SiteInfo>::iterator iter;
iter = std::find_if(test_vector.begin(), test_vector.end(),
FindSiteByID(SiteNum));
}
补充说明(Supplement):
版上各位好,不好意思小弟不才上来请教一下各位关于operator overloading跟
Functor的概念。
我在工作上看到同事把一群struct SiteInfo放进vector,
然后使用Functor搭配find_if去寻找自己要的东西。
我看了侯捷的STL书籍Functor的概念,就是把function包成物件来使用。
虽然大概体会到Functor的意思,但我还是觉得很抽象。
有两个地方想请教一下版上各位先进
1. 我猜想find_if这一行的意思是这样的
a. 首先FindSiteByID(SiteNum)会先建立一个暂时的struct物件, 把SiteNum塞进去
b. find_if内建的循环逐一把iterator指向的struct与暂时物件拿来比较是否正确
我看find_if的实作
template<class _InIt, class _Pr> inline
_InIt _Find_if(_InIt _First, _InIt _Last, _Pr _Pred)
{ // find first satisfying _Pred
for (; _First != _Last; ++_First)
if (_Pred(*_First))
break;
return (_First);
}
我不明白这一行
if (_Pred(*_First))
为什么会去呼叫
FindSiteByID::operator()(SiteInfo& info)
可否请版上各位解释一下operator()的意思?我无法体会这一点。
我了解FindSiteByID(SiteNum)会去找FindSiteByID的所有建构式中,
输入引数int的那一个建构式。
但我不懂为什么if (_Pred(*_First))会去找operator()?
2. 我工作上的project类似要寻找特定物件的功能很多,
我想说如果每一个都写成一个strcut,会很难管理。
如果我建立一个新的class,把自己定义的functor全部包起来,
是否合适?
谢谢各位。
作者: legendmtg (CLANNAD)   2014-11-22 18:16:00
因为_Pred是已经建立的object 不是type
作者: Feis (永远睡不着 @@)   2014-11-22 18:19:00
当 a 是个物件时, a(b) 会试着呼叫 a.operator()(b)写很多个 struct 有错吗?
作者: legendmtg (CLANNAD)   2014-11-22 18:24:00
2看不太懂耶 什么叫把functor全包起来 你是只想放在同个namespace下的意思 还是什么....不想写很多个就想办法做成template吧
作者: LPH66 (-6.2598534e+18f)   2014-11-22 20:37:00
我猜原 PO 第二点想要的大概就是 namespace不过还是要原 PO 讲一下他所谓的“很难管理”是什么意思..
作者: suhorng ( )   2014-11-22 21:58:00
若 A 是个 type (例如 class A {...};), 那 A() 呼叫的就是建构子; 若 A 是个变量(如 MyObj A;), 那 A() 呼叫的就会是 A.operator()(...);
作者: dirkc (3781615)   2014-11-22 22:30:00
第二个问题是设计的大哉问,可能要看你会做的动作有哪些我的浅见是需要先厘清设计的概念模型,先确定哪些物件以及它们彼此间的关系,看状况考虑用继承或多型,template 或namespace
作者: LPH66 (-6.2598534e+18f)   2014-11-23 15:28:00
差别就只是在这个名字到底是什么东西而已FindSiteByID 是个 class 名所以是这种行为_Pred 是个变量名所以是那种行为, 而它的型态是模版参数_Pr事实上在模版实现时代入 FindSiteByID 的正是这个 _Pr而不是代入到 _Pred; 那玩意也无法代入就是个变量名而已

Links booklink

Contact Us: admin [ a t ] ucptt.com