C++ 将另一个参数传递给函子';s图书馆
我想将另一个参数传递给libtins库中的函数,如下所示: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
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。因此,您的解决方案可能有效,并且我的代码中可能存在错误。谢谢。您的三个解决方案都有效,我只是一次打开的文件太多。现已修复。