2012-12-20 13 views
7

Mam problemy, aby ten wiersz tutaj rację:Jak poprawnie użyć parametru boost async_write z wektorem 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_ posiada szereg boost::asio::const_buffers

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

Te rzeczy działa, ale jestem pewien, że jest to sposób bardziej elegancki sposób aby to zrobić, a jeśli nie, chciałbym to zrobić od kogoś z nieco większym doświadczeniem.

Czy to rozwiązanie można poprawić? Jeśli tak to jak?

Odpowiedz

5

myślę szukasz to:

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

gdzie make_buffer jest zdefiniowany jako:

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); 
} 

który jest rodzajowy funkcja na drodze.

+1

OK, to jest rzeczywiście czystsze, dzięki. Ale w zasadzie robisz to samo - prawda? Zastanawiam się, czy istnieje sposób bezpośredniego obsadzenia 'boost :: asio :: const_buffer' w' boost :: asio :: buffer' - w pewnym sensie: 'boost :: asio :: buffer_cast (vector_.front()) '- czy wiesz, czy jest to możliwe/niemożliwe? – Jook

+0

@Jook: Jeśli ci się nie podoba, możesz zmienić nazwę w dowolnym momencie z 'make_buffer' na' buffer_cast' (w twojej przestrzeni nazw) i wywołać ją. – Nawaz

+1

hehe, nazwa jest w porządku;) Zastanawiam się tylko, czy można to osiągnąć poprzez bezpośrednie przekształcanie typu rahter niż za pomocą funkcji. – Jook

4

Elegancki sposób przekazywania bufora bezpośrednio do boost::asio::buffer. Jedna z wersji overloadeds pobiera jeden kod boost::asio::const_buffer i zwraca typ, który może być użyty w boost::asio::async_write, ponieważ spełnia wymagania koncepcji ConstBufferSequence.

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

Zgodnie z ogólną zasadą aplikacje nigdy nie powinny używać boost::asio::buffer_cast.

Powiązane problemy