В проекте я наткнулся на следующий код.

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. Но использование перегрузки внутри структуры таким образом для меня в новинку. Может ли кто-нибудь прояснить его использование?

c++
0
achoora 18 Фев 2016 в 12:43

3 ответа

Лучший ответ
RawCreate()

Я понимаю, что это вызовет функцию, определенную () внутри структуры.

Если RawCreate - функция, то она вызовется. Если это тип, он создаст экземпляр. RawCreate - это класс, поэтому последнее верно. T::operator() не вызывается этим выражением .., если RawCreate не является переменной типа T, определяющей оператор.

Я знаю, что класс и структура имеют только несколько отличий в cpp

Чтобы уточнить, единственная разница в том, что классы, объявленные с ключевым словом struct, и классы, объявленные с ключевым словом class, имеют разные спецификатор доступа по умолчанию.

Кто-нибудь может прояснить его использование?

Документация map_erase_if должна описывать, как используется оператор. Предположительно, operator() функтора используется как предикат для стирания.

4
eerorika 14 Июл 2016 в 12:54

Как говорили другие, RawCreate() не вызывает operator (), он просто создает экземпляр (который затем копируется).

Затем operator () (наиболее вероятно) вызывается для каждого элемента карты при итерации во время map_erase_if() (и если оператор вернет истину, элемент будет удален, если функция работает так, как указано в названии) .

0
axalis 18 Фев 2016 в 09:51

RawCreate() создает экземпляр RawCreate.

Ваш код работает так:

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

Но избегает создания ненужной переменной.

Предположительно, map_erase_if затем будет вызывать экземпляр operator() с каждым членом cfgIp.m_raw (или передавать экземпляр тому, что делает).

1
molbdnilo 18 Фев 2016 в 09:51