ฉันกำลังเล่นกับ C ++ lambdas และการแปลงโดยนัยเป็นฟังก์ชันพอยน์เตอร์ ตัวอย่างเริ่มต้นของฉันใช้เป็นคำเรียกกลับสำหรับฟังก์ชัน ftw สิ่งนี้ได้ผลตามที่คาดไว้
#include <ftw.h>
#include <iostream>
using namespace std;
int main()
{
auto callback = [](const char *fpath, const struct stat *sb,
int typeflag) -> int {
cout << fpath << endl;
return 0;
};
int ret = ftw("/etc", callback, 1);
return ret;
}
หลังจากแก้ไขเพื่อใช้การจับภาพ:
int main()
{
vector<string> entries;
auto callback = [&](const char *fpath, const struct stat *sb,
int typeflag) -> int {
entries.push_back(fpath);
return 0;
};
int ret = ftw("/etc", callback, 1);
for (auto entry : entries ) {
cout << entry << endl;
}
return ret;
}
ฉันได้รับข้อผิดพลาดของคอมไพเลอร์:
error: cannot convert ‘main()::<lambda(const char*, const stat*, int)>’ to ‘__ftw_func_t {aka int (*)(const char*, const stat*, int)}’ for argument ‘2’ to ‘int ftw(const char*, __ftw_func_t, int)’
หลังจากอ่านบางส่วน ฉันได้เรียนรู้ว่า lambdas ที่ใช้แคปเจอร์ไม่สามารถแปลงเป็นฟังก์ชันพอยน์เตอร์ได้โดยปริยาย
มีวิธีแก้ปัญหานี้หรือไม่? ความจริงที่ว่าพวกเขาไม่สามารถแปลงค่าเฉลี่ย "โดยปริยาย" ที่พวกเขาสามารถแปลง "โดยชัดแจ้ง" ได้หรือไม่? (ฉันลองแคสติ้ง แต่ไม่ประสบความสำเร็จ) อะไรคือวิธีที่สะอาดในการปรับเปลี่ยนตัวอย่างการทำงานเพื่อที่ฉันจะได้ต่อท้ายรายการกับวัตถุบางอย่างโดยใช้ lambdas