我正在尝试使用 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/