c++ - 如何在方法参数中使用 boost::asio::buffer

标签 c++ boost

我正在尝试使用 boost::asio::buffer作为我的方法中的引用参数,如下所示:

void ReadDataIntoBufferPassedIn(boost::asio::buffer & buffer);

首先,编译器提示:

error: no type named 'buffer' in namespace 'boost::asio' void ReadDataIntoBufferPassedIn(boost::asio::buffer & buffer);

这看起来需要我在这里对方法进行模板化,但我的问题不仅仅是修复错误。

问题:
在不导致我传入的 asio::buffer 的额外拷贝的情况下执行此操作的最佳方法是什么?一种模板化方式?如何?如果没有,我如何解决此错误并仍然能够将 boost::asio::buffer 作为方法参数传递?

最佳答案

根据你的问题,我不清楚你是否知道 boost::asio::buffer 是一个创建缓冲区对象(可变或常量)的函数 ),所以这解释了编译错误。 Buffer 对象只是一些连续内存块的句柄,它只包含指向原始数据及其大小的指针 - (void*, size_t) 对.

如果您需要修改底层数据,您可以通过传递对 mutable_buffer 的引用并摆弄它来实现,如下所示: http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/mutable_buffer.html但是只传递数据的实际容器而不是它的 buffer View 应该更安全(类型安全方面)。

更新: 您真的不需要像其他答案中建议的那样将您的函数设为模板。此外,可能不需要右值引用。这完全取决于您要对该函数执行的操作。

void ReadDataIntoBufferPassedIn(const boost::asio::mutable_buffer& buffer) {
   int* p = boost::asio::buffer_cast<int*>(buffer);
   *p = 5; // Do whatever you want with p
}

std::vector<int> v{1,2,3}; 
ReadDataIntoBufferPassedIn(boost::asio::buffer(v));

关于c++ - 如何在方法参数中使用 boost::asio::buffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47538682/

相关文章:

c++ - Boost:spirit 解析成结构并重用它的一部分

c++ - 比较 vector 中元素的最有效和最快的方法?

c++ - 重载++ 运算符以递增迭代器

c++ - 将 char* 转换为结构

c++ - 如何将现有类(class)用于新职责

c++ - 装饰者模式 vs. 调用 super 反模式

boost - 从 Boost MultiIndex 中删除

c++ - 创建 C++ 链接列表时出现编译错误。体系结构 x86_64 : 的 undefined symbol

c++ - boost asio 计时器不适用于阻塞读取调用

boost - 如何从 boost::asio::streambuf 获取二进制数据