2010-04-23 17 views
6
typedef boost::interprocess::managed_shared_memory::segment_manager 
    segment_manager_t; // Works fine, segment_manager is a class 
typedef boost::interprocess::adaptive_pool 
    allocator_t; // Can't do this, adaptive_pool is a template 

विचार यह है कि अगर मैं बूस्ट इंटरप्रोसेस के बीच स्विच करना चाहता हूं तो साझा स्मृति और आवंटकों के लिए कई अलग-अलग विकल्प, मैं बस टाइपपीफ को संशोधित करता हूं। दुर्भाग्य से आवंटक टेम्पलेट्स हैं, इसलिए मैं उस आवंटक को टाइप नहीं कर सकता जिसे मैं उपयोग करना चाहता हूं।सी ++ टेम्पलेट के लिए उपनाम?

क्या सी ++ में किसी टेम्पलेट में उपनाम प्राप्त करने का कोई तरीका है? (स्पष्ट #define ALLOCATOR_T boost::interprocess::adaptive_pool के अलावा)

उत्तर

17

हाँ, (अगर मैं आपके सवाल का सही ढंग से समझ) आप की तरह एक struct में "रैप" कर सकते हैं टेम्पलेट:

template<typename T> 
class SomeClass; 

template<typename T> 
struct MyTypeDef 
{ 
    typedef SomeClass<T> type; 
}; 

और के रूप में उपयोग:

MyTypeDef<T>::type 

संपादित करें: सी ++ 0x

template<typename T> 
using MyType = SomeClass<T>; 

EDIT2 की तरह कुछ का समर्थन करेंगे: अपने उदाहरण के मामले में

typedef boost::interprocess::adaptive_pool allocator_t; 

हो सकता है

template<typename T> 
struct allocator_t 
{ 
    typedef boost::interprocess::adaptive_pool<T> type; 
} 

और

allocator_t<SomeClass>::type 
+0

धन्यवाद! लपेटने की विधि चाल थी। मुझे सी ++ 0x उदाहरण जीसीसी 4.4.1 में -std = C++ 0x का उपयोग करके काम नहीं कर सका। 'टेम्पलेट <टाइपनाम टी, टाइपनाम एस> टाइपपीफ बूस्ट :: इंटरप्रोसेस :: अनुकूली_पूल allocator_t;' त्रुटि 'देता है:' typedef 'का टेम्पलेट घोषणा – porgarmingduod

1

सी ++ इसका समर्थन नहीं करता है, हालांकि इसे नए मानक में तय किया जाना है। यदि कोई गैर-तुच्छ कन्स्ट्रक्टर नहीं हैं (या यदि आप कुछ अग्रेषण कन्स्ट्रक्टर लिखने में खुश हैं) तो आप adaptive_pool से एक नया वर्ग टेम्पलेट प्राप्त करने से दूर हो सकते हैं।

template <class T> 
class allocator_t : public adaptive_pool<T> { 
public: 
    // Just making up a forwarding constructor as an example. I know nothing 
    // anything about adaptive_pool. 
    allocator_t(int arg1, float arg2) : adaptive_pool<T>(arg1, arg2) { } 
}; 

संपादित करें: इस उत्तर को भूल जाएं। मेरा वोट @ अक्कंश जाता है।

+0

अन्य वर्ग से एक वर्ग टेम्पलेट पाने के रूप में इस्तेमाल समस्या यह है कि यह एक अलग प्रकार का हो जाता है, इसलिए किसी भी कार्य करता है कि आधार वर्ग ले जाएगा काम नहीं। कक्षा के नाम को एक संरचना में लपेटने के साथ, प्रकार वही रहता है और टाइपिफ़ की तरह कार्य करता है यानी यह वही प्रकार है। – Akanksh

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