मैं फंक्शन पॉइंटर्स में C ++ लैंबडास और उनके निहित रूपांतरण के साथ खेल रहा था। मेरा शुरुआती उदाहरण उन्हें फूट फंक्शन के लिए कॉलबैक के रूप में इस्तेमाल कर रहा था। यह उम्मीद के मुताबिक काम करता है।
#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)’
कुछ पढ़ने के बाद। मैंने सीखा है कि कैद का उपयोग करने वाले लंबोदरों को फ़ंक्शन बिंदुओं में परिवर्तित नहीं किया जा सकता है ।
क्या इसके आसपास कोई कार्य है? क्या तथ्य यह है कि वे "निहित" रूपांतरित नहीं हो सकते हैं इसका मतलब यह है कि वे "स्पष्ट रूप से" रूपांतरित हो सकते हैं? (मैंने सफलता के बिना, कास्टिंग की कोशिश की)। कामकाजी उदाहरण को संशोधित करने का एक साफ तरीका क्या होगा ताकि मैं प्रविष्टियों को लंबदा का उपयोग करके किसी वस्तु में जोड़ सकूं?
void *
) के लिए एक अतिरिक्त तर्क के माध्यम से किया जाता है । यदि आप जिस लाइब्रेरी का उपयोग कर रहे हैं, वह इस अतिरिक्त तर्क के लिए अनुमति देता है, तो आपको वर्कअराउंड मिलेगा। अन्यथा, आपके पास साफ-साफ हासिल करने का कोई रास्ता नहीं है कि आप क्या करना चाहते हैं।