5

क्या कक्षा के प्रतिलिपि बनाने के लिए सदस्य फ़ंक्शन पॉइंटर प्राप्त करने का कोई तरीका है? मुझे पता है कि एक सामान्य सदस्य फ़ंक्शन पॉइंटर को कैसे परिभाषित और उपयोग करना है, लेकिन मुझे इसे प्राप्त करने का कोई तरीका पता नहीं लग रहा है।मैं कक्षा के कॉपी कन्स्ट्रक्टर को सदस्य फ़ंक्शन पॉइंटर कैसे प्राप्त कर सकता हूं?

+5

आप नहीं कर सकते। रचनाकारों के पास नाम नहीं हैं। –

+0

आप जो भी करना चाहते हैं उसके आधार पर आप नहीं कर सकते हैं, तो आप लैम्डा का उपयोग करके एक समाधान ढूंढ सकते हैं। अर्थात। इसे लम्दा में डाल देना – Makaronodentro

+8

यह एक [एक्सवाई समस्या] (http://xyproblem.info/) की तरह लगता है। मान लीजिए कि आप किसी भी तरह से एक निर्माता को पॉइंटर प्राप्त करने में कामयाब रहे (न कि आप कर सकते हैं) - आप इसका उपयोग कैसे करेंगे? आप जिस वास्तविक समस्या को हल करने की कोशिश कर रहे हैं वह क्या है? –

उत्तर

3

सी ++ मानक के अनुसार, "एक कन्स्ट्रक्टर का पता नहीं लिया जाएगा," इसलिए आप जो भी पूछ रहे हैं वह करना संभव नहीं है। हालांकि, एक सरल कामकाज है। नीचे दिया गया कोड फ़ंक्शन पॉइंटर को उस फ़ंक्शन पर देता है जो उसके इनपुट की एक प्रति बनाता है।

template<class obj> auto GetCopyConstructor() -> obj(*)(const obj&) 
{ 
    return +[](const obj& o) { return obj(o); }; 
}  
struct foo 
{ 
    std::string msg; 
    foo(const std::string& my_msg) { msg = my_msg; } 
    foo(const foo&) = default; 
}; 
int main() 
{ 
    auto make_copy = GetCopyConstructor<foo>(); 
    foo a("Hello, world"); 
    foo b = make_copy(a); 
    std::cout << b.msg << std::endl; 
} 

वैकल्पिक रूप से: (ए सरलीकरण कि भी अतिरिक्त उपयोग के मामलों को शामिल किया गया)

template<class obj> obj Copy(const obj& o) { return obj(o); } 
template<class obj> obj* CopyNew(const obj& o) { return new obj(o); } 
template<class obj> obj CopyFromPtr(const obj* o) { return obj(*o); } 
template<class obj> obj* CopyNewFromPtr(const obj* o) { return new obj(*o); } 
template<class obj> void* WhyWouldYouEvenWantToDoThis(const void* o) 
{ return new obj(*(obj*)o); } 
int main() 
{ 
    foo(*make_copy)(const foo&) = Copy<foo>; 
    foo a("Hello, world"); 
    foo b = make_copy(a); 
    std::cout << b.msg << std::endl; 
} 
+0

केवल गायब रेखाएं # शामिल हैं और # शामिल , और कोड जीसीसी कंपाइलर का उपयोग कर सी ++ 11 और सी ++ 14 दोनों में काम करता है। आपको किस तरह की समस्या हो रही है? –

+0

[कभी भी दिमाग] (http://stackoverflow.com/questions/18889028/a-positive-lambda-what-sorcery-is-this)। आज कुछ नया सीख लिया। – StoryTeller

+0

+ आवश्यक नहीं होना चाहिए, यह सुनिश्चित नहीं है कि यह क्यों है? इसे बिना किसी ठीक रूपांतरण पर एक निहित रूपांतरण ट्रिगर करना चाहिए। –

संबंधित मुद्दे