我在一个项目中遇到了以下代码。
map_erase_if(cfgIp.m_raw, RawCreate());
据我所知,这将在结构中调用()定义的函数。
Rawcreate是一种结构,如下所示。
struct RawCreate {
bool operator()(const Device::StoreElm& el) {
Pcap* pcap = NULL;
pcap = Pcap::findServer(el.second->name());
if (!pcap) {
try {
MEM_NEW(pcap,Pcap(*el.second));
} catch (Exception& ex) {
MAND_LOG(DBG_SIPTCP, "Error:%s", ex.what());
}
}
for (RejItr itr = CfgIp::m_rejectList.begin(); itr != CfgIp::m_rejectList.end(); ++itr) {
if(ip_equal(itr->first, pcap->getInterface(), false) && !itr->second.empty()) {
pcap->blockReg();
}
}
if (pcap) {
MEM_DELETE(el.second);
return true;
}
return false;
}
};
我已经看到运算符重载了类对象。我知道类和结构在cpp中只有很少的差别。但是在这种方式中使用结构中的重载对我来说是一件新事。任何人都可以澄清它的用法吗?
答案 0 :(得分:4)
RawCreate()
据我所知,这将在结构中调用()定义的函数。
如果RawCreate
是一个函数,那么这将调用它。如果它是一个类型,那么它将构造一个实例。 RawCreate
是一个类,所以后者是真的。 T::operator()
不被此表达式调用..除非RawCreate
是定义运算符的T
类型的变量。
我知道类和结构在cpp中只有很少的差异
只是为了澄清,唯一的区别是,使用struct
关键字声明的类和使用class
关键字声明的类默认情况下具有不同的access specifier。
任何人都可以澄清其用法吗?
map_erase_if
的文档应描述如何使用运算符。据推测,函子的operator()
被用作擦除的谓词。
答案 1 :(得分:1)
RawCreate()
创建RawCreate
。
您的代码就像这段代码一样:
RawCreate c;
map_erase_if(cfgIp.m_raw, c);
但避免创建不必要的变量。
据推测,map_erase_if
随后将与operator()
的每个成员调用实例cfgIp.m_raw
(或将实例传递给可执行的操作)。
答案 2 :(得分:0)
正如其他人所说,RawCreate()
不会调用operator ()
,它只会创建一个实例(然后将其复制)。
当operator ()
期间迭代时,map_erase_if()
(最有可能)为地图的每个项目调用(如果操作符返回true,则该项目将被删除,如果该函数作为名称广告)。