2013-06-24 9 views
5

के लिए ऑपरेटर तो मैं अपने सभी लॉगिंग उद्देश्यों के लिए Boost.Log का उपयोग करना चाहता हूं। मैंने वर्तमान में एक कक्षा लिखी है जिसमें तत्काल प्रक्रियाओं को स्थापित करने और स्थापित करने के सभी आवश्यक संचालन शामिल हैं।ओवरलोडिंग << बूस्ट लॉगिंग ऑब्जेक्ट

समस्या यह है कि मैं इसे < < ऑपरेटर को कोउट तरीके से उपयोग करने के लिए ओवरलोड करना चाहता हूं। मैं इसे अलग-अलग तर्क प्रकारों के लिए उपयोग करने में सक्षम होना चाहता हूं, यह सबसे बड़ा मुद्दा प्रतीत होता है। मैं समझता हूँ कि यह एक छोटे से दोषपूर्ण में यह तर्क है,

template <typename T> 
void trace::operator <<(T data) 
{ 
    std::string text=boost::lexical_cast<std::string>(data); 
    std::cout<<data<<std::endl; 
    BOOST_LOG_TRIVIAL(debug) << text; 
} 

हालांकि:

यहाँ मैं क्या करने की कोशिश की है। < < पर एकाधिक तर्क पारित करने में सक्षम होने के लिए इसे रिकर्सिव होना चाहिए। लेकिन मैं थोड़ा उलझन में हूं कि मैं इसे बढ़ावा लॉग के साथ कैसे करूंगा।

क्या मुझे सुविधाजनक बूस्ट मैक्रो के बजाय कस्टम सिंक के साथ लॉग सिस्टम को परिभाषित करना है? यदि ऐसा है तो यह std :: ostream रिटर्न का समर्थन करता है? मुझे लगता है कि यह स्ट्रीम में वापसी मूल्य और इनपुट मूल्य होगा।

+0

मैं इसे कस्टम ऑब्जेक्ट में उपयोग करने में सक्षम होना चाहता हूं। मेरे पास कई धागे हैं जिनके लिए मैं अपनी 'लॉगिंग' ऑब्जेक्ट चाहता हूं। – bge0

उत्तर

3

यदि मैं आपका प्रश्न सही ढंग से समझता हूं, तो आपको < < ऑपरेटर का उपयोग करके अपने ऑब्जेक्ट के बारे में जानकारी लॉग इन करने की आवश्यकता है।

class your_class_t{ 
public: 
    std::string m_data; 
    int m_value; 

    friend std::ostream& operator<< (std::ostream& oss, your_class_t const & val) { 
    oss<<val.m_data << ": " << val.m_value; 
    return oss; 
    } 
} 

तो फिर तुम ostream में अपने वर्ग धक्का कर सकते हैं::

your_class_t mytest; 
mytest.m_data = "hi"; 
mytest.m_value = 123; 
BOOST_LOG_TRIVIAL(debug) << mytest; 

आप मिल जाएगा लॉग का उपयोग करता ostream संगत ऑपरेटरों को बढ़ावा, इसलिए आप सभी की जरूरत अपने वर्ग के लिए < < ऑपरेटर परिभाषित करने के लिए है hi: 123

+1

नोट: एसटीएल! = सी ++ मानक पुस्तकालय। एसटीएल में कभी भी iostream कार्यक्षमता निहित नहीं है। – Aleph

+0

धन्यवाद, एसटीएल नहीं, लेकिन std – Heavy

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