我想将另一个参数传递给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?
答案 0 :(得分:1)
是的,只需使用lambda
sniffer.sniff_loop([i] (PDU &pdu) -> bool {
doo(pdu, i);
});
答案 1 :(得分:1)
还是有更好的解决方案?
如果库可以使用可调用对象(如仿函数,lambda或std::function
),则可以使用优雅的解决方案。如果没有,您需要:
将i
存储在合适范围内的变量中,以便您的回调函数可以使用它。
定义一个回调函数,该函数匹配库所需函数的签名。在调用库中使用该函数。
使用存储在其他变量中的i
值调用您从上一个函数发布的函数。
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));
}