2012-08-02 16 views
13

क्या बूस्ट लाइब्रेरी एक सुरक्षित बूल मुहावरे का कार्यान्वयन प्रदान करती है, ताकि मैं अपनी कक्षा से इसे प्राप्त कर सकूं?बढ़ावा में सुरक्षित बूल मुहावरे?

यदि हां - यह कहां है?

यदि कोई - यह अपने आप को लागू करने से परे मेरे विकल्प क्या हैं?


मैं निम्नलिखित समान प्रश्न पाया: "Is there a safe bool idiom helper in boost?" और स्वीकार किए जाते हैं जवाब Boost.Operators में bool_testable<> का उपयोग कर पता चलता है।

दुर्भाग्य से, जब मैं boost manual जाँच की मैं इसे वहाँ मिल सकता है। इसका उपयोग करने वाला कोड भी संकलित करने में विफल रहता है।

मैंने एक और एसओ प्रश्न "Was boost::bool_testable<> relocated or removed?" पर भी ठोकर खाई और टिप्पणी में बताया गया है कि bool_testable वास्तव में कभी भी किसी भी रिलीज संस्करण को बढ़ावा देने के लिए नहीं बनाया गया है।

वहाँ भी एक दिलचस्प article by Bjorn Karlsson विषय है जो एक कोड है जो जा मेरी परियोजना में कॉपी-पेस्ट किया सका पर है। हालांकि, मुझे उम्मीद है कि एक सामान्य रूप से स्वीकृत और रखरखाव उपयोगिता लाइब्रेरी (जैसे बूस्ट) है जो पहले से ही लागू होती है।


संगतता कारणों के लिए, मैं नहीं चाहता कि सी ++ 11 पर भरोसा करना चाहते हैं।

+3

क्या आपने स्पष्ट रूप से 'बूल' में परिवर्तित नहीं होने से समस्या को हल करने पर विचार किया है? –

+2

इस आलेख के पृष्ठ 3 पर पुनः उपयोग करने योग्य सुरक्षित बूल कार्यान्वयन है: http://www.artima.com/cppsource/safebool.html –

+0

धन्यवाद। मैंने इसका जिक्र नहीं किया, लेकिन मैंने इसे देखा और मैं उस कोड को कॉपी-पेस्ट कर सकता हूं, लेकिन मैं उम्मीद कर रहा था कि कुछ सामान्य रूप से स्वीकृत और रखरखाव उपयोगिता लाइब्रेरी (बूस्ट पहले दिमाग में आता है) पहले से ही ऐसा करता है। – CygnusX1

उत्तर

15

मुझे लगता है कि सुरक्षित-bool मुहावरा प्रदान करता है एक सामान्य रूप से स्वीकृत उपयोगिता पुस्तकालय का पता नहीं है। बूस्ट के भीतर कुछ प्रयास किए गए हैं, और वे अक्सर सुरक्षित-बूल कार्यान्वयन (नामकरण सम्मेलन, मैक्रोज़, इनलाइन में शामिल हैं, विरासत) प्रदान करने के तरीके के बारे में बहस करते हैं। नतीजतन, बूस्ट के भीतर मौजूद कम से कम तीन कार्यान्वयन हैं, केवल कार्यान्वयन में से एक, Boost.Spirit.Classic's safe_bool, बाहरी उपयोग के लिए डिज़ाइन किया गया है।


विवरण और प्रत्येक कार्यान्वयन के लिए अवधारणाओं:

  • Boost.Range's safe_bool
    • विस्तार निर्देशिका के भीतर निहित है, तो स्पष्ट रूप से बाहरी उपयोग के लिए नहीं बनाया गया।
    • टेम्पलेट सहायक प्रकार और स्थैतिक सदस्य फ़ंक्शंस का उपयोग करके कार्यान्वित किया गया।
    • सुरक्षित bool सक्षम वर्ग की उम्मीद है:
      • एक operator boost::range_detail::safe_bool<MemberPtr>::unspecified_bool_type() const सदस्य समारोह प्रदान करें कि स्थिर safe_bool::to_unspecified_bool() समारोह के प्रतिनिधियों।
  • Boost.SmartPtr's operator_bool:
    • , विस्तार निर्देशिका के भीतर निहित तो स्पष्ट रूप से बाहरी उपयोग के लिए नहीं बनाया गया।
    • हेडर फ़ाइल का उद्देश्य कक्षा परिभाषा के भीतर सीधे शामिल करना है। उदाहरण के लिए shared_ptr.hpp देखें।
    • समेत boost/detail/workaround.hpp सहित आवश्यक है।
    • आसपास के सुरक्षित-bool सक्षम वर्ग की उम्मीद है करने के लिए:
      • एक this_type प्रकार प्रदान करें।
      • T प्रकार प्रदान करें।
      • T* px सदस्य चर प्रदान करें।
  • Boost.Spirit.Classic's safe_bool
    • बाहरी उपयोग के लिए बनाया गया है।
    • CRTP पैटर्न का उपयोग करता है।
    • बेस क्लास चेनिंग का समर्थन करने के लिए डिज़ाइन किया गया है, जो boost::spirit::class::safe_bool को व्युत्पन्न कक्षा पर एकाधिक विरासत के बिना उपयोग किए जाने की अनुमति देता है।
    • सुरक्षित bool सक्षम वर्ग की उम्मीद है:
      • सार्वजनिक रूप से boost::spirit::classic::safe_bool<Derived> से निकाले जाते हैं। यदि Derived पहले से ही Base से विरासत में मिलता है, तो boost::spirit::classic::safe_bool< Derived, Base > का उपयोग करें।
      • bool operator_bool() const सदस्य फ़ंक्शन प्रदान करें।

इस उदाहरण को बढ़ावा 1.50 उपयोग करता है। प्रत्येक वर्ग बूलियन संदर्भ में सही करने के लिए मूल्यांकन करना चाहिए यदि पूर्णांक निर्माता के लिए पारित 0 से अधिक है:

// Safe-bool idiom with Boost.Range. 
#include <boost/range/detail/safe_bool.hpp> 
class range_bool 
{ 
public: 
    range_bool(int x) : x_(x) {} 
private: 
    // None of these are required, but makes the implementation cleaner. 
    typedef boost::range_detail::safe_bool< int range_bool::* > safe_bool_t; 
    typedef safe_bool_t::unspecified_bool_type unspecified_bool_type; 
    int dummy; 
public: 
    operator unspecified_bool_type() const 
    { 
    return safe_bool_t::to_unspecified_bool(x_ > 0, &range_bool::dummy); 
    } 
private: 
    int x_; 
}; 

// Safe-bool idiom with Boost.SmartPtr. 
#include <boost/detail/workaround.hpp> 
class smart_ptr_bool 
{ 
public: 
    smart_ptr_bool(int x) { px = (x > 0) ? &dummy : 0 ; } 
private: 
    typedef smart_ptr_bool this_type; // -. 
    typedef int T;     // :- Required concepts when using 
    T* px;       // -' smart_ptr's operator_bool. 
private: 
    T dummy; // Simple helper. 
public: 
    #include <boost/smart_ptr/detail/operator_bool.hpp> 
}; 

// Safe-bool idiom with Boost.Spirit. 
#include <boost/spirit/include/classic_safe_bool.hpp> 
class spirit_bool: public boost::spirit::classic::safe_bool<spirit_bool> 
{ 
public: 
    spirit_bool(int x) : x_(x) {} 
public: 
    // bool operator_bool() is required by the spirit's safe_bool CRTP. 
    bool operator_bool() const { return x_ > 0; } 
private: 
    int x_; 
}; 

#include <iostream> 

int main() 
{ 
    std::cout << "range_bool(-1):  " << range_bool(-1)  << std::endl 
      << "range_bool( 1):  " << range_bool( 1)  << std::endl 
      << "smart_ptr_bool(-1): " << smart_ptr_bool(-1) << std::endl 
      << "smart_ptr_bool( 1): " << smart_ptr_bool( 1) << std::endl 
      << "spirit_bool(-1): " << spirit_bool(-1) << std::endl 
      << "spirit_bool( 1): " << spirit_bool( 1) << std::endl; 
    return 0; 
} 

परिणामस्वरूप उत्पादन:

range_bool(-1):  0 
range_bool( 1):  1 
smart_ptr_bool(-1): 0 
smart_ptr_bool( 1): 1 
spirit_bool(-1): 0 
spirit_bool( 1): 1

मैं किसी भी विकल्प के पता नहीं है। जब मैं सुरक्षित-बूल मुहावरों में भाग गया हूं, तो अधिकांश कार्यान्वयन Bjorn Karlsson's article में दिए गए कार्यान्वयन के प्रति-और-पेस्ट वेरिएंट रहे हैं।

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