在cpp中的结构内部重载()运算符

时间:2016-02-18 09:43:55

标签: c++

我在一个项目中遇到了以下代码。

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中只有很少的差别。但是在这种方式中使用结构中的重载对我来说是一件新事。任何人都可以澄清它的用法吗?

3 个答案:

答案 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,则该项目将被删除,如果该函数作为名称广告)。