2012-12-20 14 views
7

मैं यहाँ इस लाइन बनाने के लिए मुसीबत हो रहा है सही:बूस्ट async_write को boost const_buffers के वेक्टर के साथ सही तरीके से कैसे उपयोग करें?

boost::asio::async_write(serialPort, 
         boost::asio::buffer(
         boost::asio::buffer_cast<const void*>(vector_.front()), 
         boost::asio::buffer_size(vector_.front()))) 

vector_boost::asio::const_buffers

std::vector<boost::asio::const_buffer> vector_; 

यह सामान काम करता है की एक संख्या रखती है, लेकिन मैं काफी यकीन है कि वहाँ एक रास्ता और अधिक सुरुचिपूर्ण तरीका है कि कर रहा हूँ ऐसा करने के लिए, और यदि नहीं, तो मैं यहां कुछ और अनुभव के साथ किसी से भी देखना चाहता हूं।

तो, क्या इस समाधान में सुधार किया जा सकता है? यदि हां, तो कैसे?

उत्तर

5

मुझे लगता है कि आप इस के लिए देख रहे:

boost::asio::async_write(serialPort, make_buffer(vector_.front())); 

जहां make_buffer के रूप में परिभाषित किया गया है:

template<typename TBuffer> 
boost::asio::buffer make_buffer(TBuffer & data) 
{ 
    auto buf = boost::asio::buffer_cast<const void*>(data); 
    auto size= boost::asio::buffer_size(data); 
    return boost::asio::buffer(buf, size); 
} 

माध्यम से एक सामान्य समारोह है।

+1

ठीक है, यह वास्तव में क्लीनर है, धन्यवाद। लेकिन मूल रूप से आप एक ही काम कर रहे हैं - है ना? मैं सोच रहा था कि 'boost :: asio :: const_buffer' को' boost :: asio :: buffer' में सीधे डालने का कोई तरीका है - कुछ हद तक: 'boost :: asio :: buffer_cast (vector_.front()) '- क्या आप जानते हैं कि यह संभव/असंभव है? – Jook

+0

@Jook: यदि आपको यह पसंद नहीं है, तो आप किसी भी समय 'make_buffer' से' buffer_cast' (अपने नामस्थान में) नाम बदल सकते हैं और इसे कॉल कर सकते हैं। – Nawaz

+1

हे, नाम ठीक है;) मैं बस सोच रहा हूं, अगर यह फ़ंक्शन का उपयोग करने से प्रत्यक्ष प्रकार-रूपांतरण राहटर के माध्यम से हासिल किया जा सकता है। – Jook

4

बफर को सीधे boost::asio::buffer पर पास करने का सुरुचिपूर्ण तरीका है। overloadeds में से एक एक boost::asio::const_buffer लेता है और boost::asio::async_write में उपयोग किया जा सकता है, क्योंकि यह ConstBufferSequence अवधारणा की आवश्यकताओं को पूरा करता है।

boost::asio::async_write(serialPort, boost::asio::buffer(vector_.front())); 

सामान्य नियम के रूप में, अनुप्रयोगों को boost::asio::buffer_cast का उपयोग करने की आवश्यकता नहीं होनी चाहिए।

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