2013-05-21 7 views
16

कोई std::empty struct या कुछ इसी तरह की है या मैं परिभाषित करने की जरूरत है अपने ही:सी ++ मानक द्वारा परिभाषित खाली संरचना है?

struct empty{}; 

यह std::conditional या अन्य नई एसटीडी सुविधाओं के साथ संयोजन में बहुत अच्छा इस्तेमाल किया जा सकता है और मुझे आश्चर्य है अगर मानक में परिभाषित करता है या नहीं।

+2

, कोई:


यह निम्नलिखित तरह से परिभाषित किया जाएगा। –

+0

क्या आप एक ऐसी संरचना चाहते हैं जिसमें अभी कोई डेटा सदस्य न हो (इस प्रकार 1 का आकार हो), या वास्तव में खाली संरचना? – kennytm

+3

शायद 'std :: tuple <>'? – jogojapan

उत्तर

5

सी ++ मानक पुस्तकालय में ऐसी कोई चीज़ नहीं है। जैसा कि टिप्पणियों में बताया गया है, आप अभी भी बूस्ट में boost::blank पा सकते हैं जो शायद आपके द्वारा देखी जा रही कक्षा के अधिकांश जैसा दिखता है। यदि मानक पुस्तकालय में ऐसी कक्षा मौजूद थी, तो मुझे नहीं लगता कि वहां कई तृतीय-पक्ष पुस्तकालय होंगे जो अपने struct empty {} को परिभाषित करते हैं।

यदि आप जो चाहते हैं वह केवल एक वर्ग है जिसमें कोई डेटा सदस्य नहीं है और सबसे छोटा संभव आकार - 1 से छोटा नहीं हो सकता है (और संभावित आधार अनुकूलन से संभवतः लाभ), तो आप अभी भी std::tuple<> का उपयोग कर सकते हैं। यह वास्तव में libstdC++ में कुछ वर्गों के कार्यान्वयन में उस सटीक उद्देश्य (खाली आधार अनुकूलन) के लिए उपयोग किया जाता है।

#include <iostream> 
#include <tuple> 
#include <type_traits> 

int main() 
{ 
    // prints 1 
    std::cout << std::is_empty< std::tuple<> >::value; 
} 
4

अगर मैं आपके सवाल का सही ढंग से समझ, आप std::conditional साथ प्रयोग करने के लिए एक त्रुटि वापसी प्रकार के लिए देख रहे हैं:

क्या आप वाकई std::tuple<> बनाना चाहते हैं वास्तव में एक खाली वर्ग है। आम तौर पर लोग मेटाप्रोग्रामिंग के लिए अपने खाली संरचना प्रकार को परिभाषित करते हैं। यह समझ में आता है क्योंकि आमतौर पर मेटाप्रोग्रामिंग लाइब्रेरीज़ को इस तरह से डिजाइन करना संभव नहीं है कि वे मनमाने ढंग से अन्य संकलन-समय पुस्तकालयों के साथ आसानी से बातचीत कर सकें।

एक वास्तविक मानक के निकटतम बात शायद Boost.MPL तो mpl::void_ की तरह कुछ का उपयोग कर अपनी स्थिति में कोई मतलब हो सकता है,।

यदि आप मानक प्रकारों पर चिपके रहने का आग्रह करते हैं, तो nullptr_t एक अच्छा मैच प्रतीत होता है।

+1

इसके लिए 'nullptr_t' का उपयोग करना वास्तव में एक अच्छा विचार है। – jleahy

+0

'nullptr_t' की एकमात्र समस्या यह है कि, अगर instanciated, यह' शून्य * 'उदाहरण के रूप में कम से कम एक बड़ा होना आवश्यक है। यदि एकमात्र उपयोग मेटाप्रोग्रामिंग है तो यह कोई समस्या नहीं होनी चाहिए। – Morwenn

2

Variant proposal (n4542) के हिस्से के रूप में इस तरह के निर्माण को जोड़ने के लिए एक अनुभाग है।

पर चुने जाने के बाद,

क्या स्टैंड में प्रकार हम "empty_t" कॉल करना चाहते हैं?
empty_t 4
खाली 4
one_t 1
खाली 6
blank_t 7
monostate 7

अपवाह:
खाली * 3
monostate 8

नाम पर सहमत होगा हो: std :: monostate।

// 2.?, Explicitly default-constructed alternative 
struct monostate {}; 
bool operator<(const monostate&, const monostate&) constexpr 
{ return false; } 
bool operator>(const monostate&, const monostate&) constexpr 
{ return false; } 
bool operator<=(const monostate&, const monostate&) constexpr 
{ return true; } 
bool operator>=(const monostate&, const monostate&) constexpr 
{ return true; } 
bool operator==(const monostate&, const monostate&) constexpr 
{ return true; } 
bool operator!=(const monostate&, const monostate&) constexpr 
{ return false; } 
मेरी जानकारी के अनुसार करने के लिए
संबंधित मुद्दे