Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将另一个参数传递给函子';s图书馆_C++_Functor - Fatal编程技术网

C++ 将另一个参数传递给函子';s图书馆

C++ 将另一个参数传递给函子';s图书馆,c++,functor,C++,Functor,我想将另一个参数传递给libtins库中的函数,如下所示: for (int i = 0; i < sizeof(dates); i++) { FileSniffer sniffer("/path/" + dates[i] + ".pcap"); sniffer.sniff_loop(doo, i); } for(int i=0;i

我想将另一个参数传递给libtins库中的函数,如下所示:

for (int i = 0; i < sizeof(dates); i++) {
    FileSniffer sniffer("/path/" + dates[i] + ".pcap");
    sniffer.sniff_loop(doo, i);
}
for(int i=0;i
这样我就可以在函数中使用参数I,如下所示:

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

文件[i]是的,只需使用lambda

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

是的,只要用一只羔羊就行了

sniffer.sniff_loop([i] (PDU &pdu) -> bool {
    doo(pdu, i);
});
还是有更好的解决方案

如果库可以使用可调用对象,例如functor、lambda或
std::function
,则有一些优雅的解决方案。如果不能,则需要:

  • i
    存储在适当范围内的变量中,以便回调函数可以使用它

  • 定义一个与库所需函数的签名匹配的回调函数。在对库的调用中使用该函数

  • 使用存储在另一个变量中的
    i
    值调用上一个函数中发布的函数


  • 还是有更好的解决方案

    如果库可以使用可调用对象,例如functor、lambda或
    std::function
    ,则有一些优雅的解决方案。如果不能,则需要:

  • i
    存储在适当范围内的变量中,以便回调函数可以使用它

  • 定义一个与库所需函数的签名匹配的回调函数。在对库的调用中使用该函数

  • 使用存储在另一个变量中的
    i
    值调用上一个函数中发布的函数



  • 尝试使用
    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));
    }
    
    #包括
    布尔杜(PDU和PDU,国际一级){
    常量IP&IP=pdu.rfind_pdu();
    
    文件[i]尝试使用
    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));
    }
    
    #包括
    布尔杜(PDU和PDU,国际一级){
    常量IP&IP=pdu.rfind_pdu();
    
    文件[i]希望,日期是一个有符号或无符号字符的数组…@Aconcagua重载的
    +
    运算符表明它不是。希望,日期是一个有符号或无符号字符的数组…@Aconcagua重载的
    +
    运算符表明它不是。谢谢。您和@Aram解决方案抛出了一个错误“在抛出'std::bad_alloc'what():std::bad_alloc'实例后调用了terminate。因此,您的解决方案可能有效,并且我的代码中可能存在错误。谢谢。您的三个解决方案都有效,我只是一次打开的文件太多。现已修复。谢谢。您的和@Aram solution抛出了一个”在抛出'std::bad_alloc'what():std::bad_alloc'实例后调用terminate。因此,您的解决方案可能有效,并且我的代码中可能存在错误。谢谢。您的三个解决方案都有效,我只是一次打开的文件太多。现已修复。