2014-04-03 6 views
15

यदि आपके पास अपारदर्शी सूचक टाइपिफ़ है, तो क्या टेम्पलेट्स में उपयोग के लिए गतिशील रूप से इंगित करने के लिए एक तरीका है? उदाहरण के लिए, मान लीजिए कि आप कुछ इस तरह है:मैं एक अपारदर्शी सूचक टाइपिफ़ से साझा_ptr कैसे बना सकता हूं? (या: मैं टाइपेडफ को "अनचाहे" कैसे कर सकता हूं?)

struct Foo; // Forward declared struct 
typedef Foo* FooPtr; // Opaque pointer 

क्योंकि स्मार्ट सूचक प्रकार सूचक-टू टाइप करें, इस की एक std::shared_ptr परिभाषित करने के लिए, ऐसा लगता है कि आप क्या कहना है के मामले में टेम्प्लेट उपलब्ध हैं:

std::shared_ptr<struct Foo> theSharedPtr; 

क्या इस तरह के पॉइंटर को "मैन्युअल" अपारदर्शी पॉइंटर टाइपपीफ को अनदेखा किए बिना परिभाषित करने का कोई तरीका है? मुझे लगता है कि मैं यहाँ कुछ स्पष्ट याद आ रही किया जाना चाहिए, लेकिन आप इन की तरह कुछ सोच सकता है (ध्यान दें: इन काम नहीं करते):

std::shared_ptr<*FooPtr> theSharedPointer; 
// or 
std::shared_ptr<pointedto(FooPtr)> theSharedPointer; 

मैं इस तरह संभव हो जाना चाहिए लग रहा है। क्या मैं कुछ भूल रहा हूँ? मुझे लगता है कि यह एक आसन्न माथे-मारना पल है ...

संपादित करें: कुछ और चारों ओर Noodling, ऐसा लगता है कि, आम मामले में, shared_ptr<T>sizeof(T) लेना चाहता है। आप कन्स्ट्रक्टर को डिलीटर प्रदान करके इसे प्राप्त कर सकते हैं। मुझे संदेह है कि यह थोड़ा बढ़त वाला मामला बनाता है, लेकिन यह अभी भी सी ++ में सभी प्रकार के wrangling के साथ लगता है, मैं हाथ से ऐसा किए बिना एक सूचक प्रकार "अनचाहे" करने में सक्षम होना चाहिए।

उत्तर

23

सी ++ 11 में:

#include <type_traits> 

typedef std::shared_ptr< std::remove_pointer<FooPtr>::type > theSharedPtr; 

सी ++ 03 आपको ठीक उसी तरह से boost::remove_pointer का उपयोग कर सकते हैं।

आप एक remove_pointer metafunction लेखन, बढ़ावा शामिल नहीं करना चाहते हैं, तो काफी आसान है:

template<class T> struct remove_pointer; 
template<class T> struct remove_pointer<T*> { typedef T type; }; 
+2

अच्छी तरह से आप std :: shared_ptr का उपयोग कर रहे हैं यह स्पष्ट है कि आप C++ 11 में हैं ... मैं वैसे भी अपना बाकी जवाब छोड़ दूंगा। – sbabbi

+0

मुझे उत्तर की पूर्णता पसंद है। –

5

हां, चूंकि आप पहले से ही C++ 11 सुविधाओं का उपयोग कर रहे हैं, तो आप इसे type traits के साथ कर सकते हैं। विशेष रूप से std::remove_pointer का उपयोग करके:

#include <type_traits> 

इसका इस्तेमाल करने की:

std::remove_pointer<Foo*>::type; // Foo 

बेशक आप विशिष्ट मानक हेडर जो है शामिल करने के लिए की आवश्यकता होगी।

2

वहाँ के बिना "मैन्युअल" अपारदर्शी सूचक typedef unwrapping इस तरह के एक सूचक निर्धारित करने का कोई रास्ता नहीं है?

#include <type_traits> 
std::shared_ptr<std::remove_pointer<FooPtr>::type> theSharedPointer; 

ऐसा लगता है कि, आम मामले में, shared_ptr<T>sizeof(T) लेना चाहता है।

यह (शायद) आकार की आवश्यकता नहीं है; लेकिन इसकी प्रारंभिकरण को एक डिलीटर बनाने की आवश्यकता है, जिसके लिए प्रकार को पूरा करने की आवश्यकता है।

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