2011-02-03 10 views
16

जाहिर है, यदि आप एक अच्छी तरह से गठित कार्यक्रम में प्रकार void का एक उदाहरण नहीं हो सकता है, तो निम्नलिखित घोषणा की तरह कुछ संकलन नहीं होगा:शून्य प्रकार :: टपल

std::tuple<void, double, int> tup; 

लेकिन, जैसा कि जब तक हम ऑब्जेक्ट्स के विरोध में सख्ती से व्यवहार कर रहे हैं, तब तक कोई समस्या नहीं है। उदाहरण के लिए, मेरी संकलक (जीसीसी) की सुविधा देता है मुझे कहते हैं:

typedef std::tuple<void, double, int> tuple_type; 

यह मेरे लिए दिलचस्प है क्योंकि ऐसा लगता है कि C++ 0x के साथ हम सिर्फ std::tuple उपयोग कर सकते हैं मेटा प्रोग्रामिंग चाल का एक बहुत प्रदर्शन करने के लिए कि पहले boost::mpl पुस्तकालय की आवश्यकता होगी। उदाहरण के लिए, हम प्रकार के वेक्टर बनाने के लिए std::tuple का उपयोग कर सकते हैं।

उदाहरण के लिए, हम एक समारोह हस्ताक्षर का प्रतिनिधित्व प्रकार की एक वेक्टर बनाना चाहते हैं:

हम सिर्फ कह सकते हैं:

template <class R, class... Args> 
struct get_function_signature; 

template <class R, class... Args> 
struct get_function_signature<R(*)(Args...)> 
{ 
    typedef std::tuple<R, Args...> type; 
}; 

यह काम करने के लिए, भले ही समारोह हस्ताक्षर एक void है लगता है टाइप करें, जब तक हम वास्तव में get_function_signature<F>::type के उदाहरण को तुरंत चालू नहीं करते हैं।

हालांकि, सी ++ 0x अभी भी मेरे लिए नया है, और निश्चित रूप से सभी कार्यान्वयन अभी भी कुछ प्रयोगात्मक हैं, इसलिए मैं इसके बारे में थोड़ा असहज हूं। क्या हम वास्तव में मेटा-प्रोग्रामिंग के लिए प्रकार के वेक्टर के रूप में std::tuple का उपयोग कर सकते हैं?

+1

मुझे उम्मीद है कि 'boost :: mpl :: vector' को बहिष्कृत किया जाएगा। वैसे भी 'बूस्ट :: एमपीएल' कार्यक्षमता और टेम्पलेट मेटाप्रोग्रामिंग में से अधिकांश सामान्य रूप से बदल जाएंगे जब विविध टेम्पलेट्स के लिए समर्थन बढ़ेगा। –

उत्तर

10

यह वास्तव में अर्थ है कि आप

typedef std::tuple<void, double, int > tuple_type;

जब तक आप केवल एक प्रकार की सूची पर tuple_element उपयोग करने के लिए के रूप में उपयोग के रूप में कर सकते हैं पड़ता है। इस प्रकार मैं

tuple_element<0,tuple_type>::type * param;

जो परम घोषणा करेंगे के रूप में void*

+0

ऐसा लगता है कि कुछ मानक लाइब्रेरी कार्यान्वयन बिना किसी समस्या के अन्य मानक लाइब्रेरी कार्यान्वयन के वर्षों के बाद भी इसे संभाल नहीं सकते हैं। उदाहरण के लिए, जीसीसी और क्लैंग ने इसे अस्वीकार कर दिया जब तक कि क्लैंग एमएसवीसी की मानक लाइब्रेरी का उपयोग नहीं कर रहा है, और एमएसवीसी इसे स्वीकार करता है। –

0

शायद, tuple साथ void तत्व सुरक्षित है जब तक हम यह दृष्टांत कर सकते हैं।
तो, हालांकि हम नहीं,

struct C : std::tuple<void> {... 

निम्नलिखित के रूप में लिख सकते हैं मैं मामले कल्पना नहीं कर सकते कि इस प्रयोग अब उपयोगी है। तो, इससे कोई फर्क नहीं पड़ता।

अच्छा, यह std::pair पर भी लागू होता है। हम निम्नलिखित के रूप में सरल प्रकार सूची लिख सकते हैं:

struct Nil; 
typedef std::pair< void, std::pair< int, Nil > > t; 

हालांकि किसी भी तरह इस तरह के pair उपयोग दुर्लभ हो रहा है।

संयोग से, tuple टाइप सूची कुछ SFINAE-जैसी उद्देश्य में विफल हो सकती है। उदाहरण के लिए, निम्नलिखित कोड ideone पर संकलित नहीं है (gcc-4.5।1) जब मैं परीक्षण किया :

std::tuple<void> f(); 
template< class T > char g(T const&); 

int main() { 
    sizeof g(f()); 
} 

तो, मुझे यकीन है कि वर्तमान प्रकार सूचियों निकट भविष्य में tuple साथ पूरी तरह से बदला जा सकता है नहीं कर रहा हूँ।