【问题标题】:Overloading () operator inside structure in cppcpp中结构内部的重载()运算符
【发布时间】:2016-07-14 20:54:41
【问题描述】:

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

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

【问题讨论】:

  • 这篇文章将帮助您理解:stackoverflow.com/questions/92859/…,所以除了默认访问说明符之外没有区别
  • en.cppreference.com/w/cpp/language/class 基本上,structclass 表示同一个实体。
  • RawCreate() 不调用operator()。它只是创建该类型的一个实例。 operator() 可能会从您未显示的 map_erase_if 函数内部调用。
  • 在 map_erase_if 中 RawCreate() 被用作 std::find_if 的谓词

标签: c++


【解决方案1】:
RawCreate()

我知道这将调用结构内部由 () 定义的函数。

如果RawCreate 是一个函数,那么它将调用它。如果它是一个类型,那么它将构造一个实例。 RawCreate 是一个类,所以后者是真的。 T::operator() 被这个表达式调用。除非RawCreate 是定义运算符的T 类型的变量。

我知道类和结构在 cpp 中只有很少的区别

澄清一下,唯一的区别是使用struct 关键字声明的类和使用class 关键字声明的类默认具有不同的access specifier

谁能解释一下它的用法?

map_erase_if 的文档应该描述如何使用操作符。想必函子的operator()是作为erase的谓词使用的。

【讨论】:

  • 如果它是一个带有operator() 的变量,它将调用该运算符;)
  • @TartanLlama 哦,是的......你实际上可以创建一个实例 RawCreate RawCreate 只是为了惹恼你的同事:)
【解决方案2】:

RawCreate() 创建RawCreate 的实例。

您的代码的工作方式类似于以下代码:

RawCreate c;
map_erase_if(cfgIp.m_raw, c);

但避免创建不必要的变量。

据推测,map_erase_if 将使用cfgIp.m_raw 的每个成员调用实例的operator()(或将实例传递给执行此操作的东西)。

【讨论】:

    【解决方案3】:

    正如其他人所说,RawCreate() 不会调用operator (),它只是创建一个实例(然后将其复制过来)。

    operator ()map_erase_if() 期间迭代时(很可能)会为地图的每个项目调用(如果操作符返回 true,则该项目将被删除,如果函数按照名称宣传的那样工作)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多