का उपयोग करते समय std :: function से फ़ंक्शन पॉइंटर प्राप्त करें, मैं std::bind
के साथ std::function
का उपयोग करने की कोशिश कर रहा हूं, लेकिन मुझे कुछ समस्याएं आ रही हैं।std :: bind
यह काम करता है:
#include <functional>
#include <iostream>
void print() {
std::cout << 2;
}
int main() {
std::function<void()> foo = print;
(*foo.target<void (*)()>())(); //prints 3
}
यह main
की दूसरी पंक्ति में दुर्घटनाओं:
#include <functional>
#include <iostream>
void print (int i) {
std::cout << i;
}
int main() {
std::function<void()> foo = std::bind (print, 2);
(*foo.target<void (*)()>())();
}
मैं वास्तव में std::function<void()>
पकड़े रहा हूँ और समारोह लौटने में सक्षम होने की जरूरत है; बस इसे बुलाओ नहीं। मुझे उम्मीद है कि उपयोग कुछ ऐसा होगा:
#include <functional>
#include <iostream>
void print (int i) {
std::cout << i;
}
int main() {
Container c (std::bind (print, 2));
//I would expect the original
c.func() (3); //prints 3
if (c.func() == print) /* this is what I'm mostly getting at */
}
क्या मूल कार्य इसे वापस करने के लिए कोई विकल्प है, या वैकल्पिक? यह रिटर्न प्रकार के साथ भी तरह का संघर्ष करता है, क्योंकि void (*)()
बाध्य हस्ताक्षर से काफी अच्छी तरह मेल खाता है।
यह संभव नहीं है: आपके कोड में 'शून्य()' हस्ताक्षर के साथ कोई फ़ंक्शन नहीं है। अगर यह संभव हो तो हमें 'std :: function' की आवश्यकता नहीं होगी। –
@ आर। मार्टिन्हो फर्नांडीस, यह एक सामान्य कार्य को स्टोर करने के लिए एक अच्छी चाल थी, लेकिन ऐसा लगता है कि यह केवल कॉलिंग को काम करता है। – chris
@chris: एक सामान्य कार्य को संग्रहीत करने का पूरा बिंदु है। सामान्य कार्यों की तुलना * बहुत * मुश्किल हो जाती है, और यह सिर्फ हिमशैल की नोक है। – Puppy