我试图理解c ++中的两件事,函子和传递引用。以下是库libtins的示例代码,可在此处libtins example获得。函数snifferloop()采用模板函子doo()

函子的声明为bool doo(PDU &some_pdu),因此类型为some_pdu的参数PDU通过引用传递给函数。

但是,doo()被称为sniffer.sniff_loop(doo);,并且似乎没有参数传递给doo()

有人可以解释一下这里发生了什么吗?抱歉,如果它是基本的。

bool doo(PDU &some_pdu) {
    // Search for it. If there is no IP PDU in the packet,
    // the loop goes on
    const IP &ip = some_pdu.rfind_pdu<IP>(); // non-const works as well
    std::cout << "Destination address: " << ip->dst_addr() << std::endl;
    // Just one packet please
    return false;
}

void test() {
    SnifferConfiguration config;
    config.set_promisc_mode(true);
    config.set_filter("ip src 192.168.0.100");
    Sniffer sniffer("eth0", config);
    sniffer.sniff_loop(doo);
}

最佳答案

sniffer.sniff_loop(doo)不会调用doo。它调用sniffer.sniff_loop,将指向doo的指针作为sniffer.sniff_loop的参数传递。然后sniffer.sniff_loop将使用该参数调用doo,并将该参数传递给doo

10-08 09:39