将另一个参数传递给仿函数库

时间:2018-01-25 16:26:07

标签: c++ functor

我想将另一个参数传递给libtins库中的函数:

for (int i = 0; i < sizeof(dates); i++) {
    FileSniffer sniffer("/path/" + dates[i] + ".pcap");
    sniffer.sniff_loop(doo, i);
}

这样我就可以在我的函数中使用参数i:

    bool doo(PDU &pdu, int i) {
    const IP &ip = pdu.rfind_pdu<IP>();
    files[i] << ip.src_addr() << std::endl;
    return true;

但是,这是不可能的,因为函数sniff_loop在库中定义并且只接受一个参数。在这种情况下,我应该修改函数的行为,还是有更好的解决方案来恢复函数sniff_loop?

3 个答案:

答案 0 :(得分:1)

是的,只需使用lambda

sniffer.sniff_loop([i] (PDU &pdu) -> bool {
    doo(pdu, i);
});

答案 1 :(得分:1)

  

还是有更好的解决方案?

如果库可以使用可调用对象(如仿函数,lambda或std::function),则可以使用优雅的解决方案。如果没有,您需要:

  1. i存储在合适范围内的变量中,以便您的回调函数可以使用它。

  2. 定义一个回调函数,该函数匹配库所需函数的签名。在调用库中使用该函数。

  3. 使用存储在其他变量中的i值调用您从上一个函数发布的函数。

  4. bool doo_2(PDU& pdu);
    static int loop_variable = 0;
    
    for (int i = 0; i < sizeof(dates); i++) {
        FileSniffer sniffer("/path/" + dates[i] + ".pcap");
        loop_variable = i;
        sniffer.sniff_loop(doo_2);
    }
    
    bool doo(PDU& pdu, int i) {
       const IP &ip = pdu.rfind_pdu<IP>();
       files[i] << ip.src_addr() << std::endl;
       return true;
    }
    
    bool doo_2(PDU &pdu) {
       doo(dpu, loop_variable);
    }
    

    来自the link you posted in a comment

      

    此方法将模板仿函数作为参数,该参数必须使用以下签名之一定义运算符:

    这向我表明你应该能够使用lambda函数。

    auto fn = [i] (PDU& pdu) -> bool { return doo(pdu, i); };
    sniffer.sniff_loop(fn);
    

答案 2 :(得分:1)

尝试使用std::bind

#include <functional>

bool doo(PDU &pdu, int i) {
    const IP &ip = pdu.rfind_pdu<IP>();
    files[i] << ip.src_addr() << std::endl;
    return true;
}

for (int i = 0; i < sizeof(dates); i++) {
    FileSniffer sniffer("/path/" + dates[i] + ".pcap");
    sniffer.sniff_loop(std::bind(&doo, std::placeholders::_1, i));
}