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

时间:2017-11-28 18:39:14

标签: 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传递的额外副本的情况下,最好的方法是什么? templatised 方式?怎么样?如果没有,我该如何解决此错误&仍然可以传递boost::asio::buffer作为方法参数吗?

2 个答案:

答案 0 :(得分:3)

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

如果你需要修改底层数据,你可以通过传递mutable_buffer的引用并摆弄它来实现这一点,如下所示: http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/mutable_buffer.html但是,为了传输数据的实际容器而不是buffer视图,它应该更加安全(类型安全)。

更新: 您不需要像在其他答案中建议的那样将您的功能变为模板。此外,可能不需要右值引用。这一切都取决于你想对这个功能做些什么。

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

答案 1 :(得分:0)

我认为我需要 templatise with universal reference ,这样才能将准备好的for g in *.gif; do d=${g%.gif}; gifsicle --resize 600x600 < "$g" > "$d-resized.gif"; done 传递给我的方法。

boost::asio::buffer

以上技巧可以很好地调用这种方法例如

template <class TheBuffer>
void ReadDataIntoBufferPassedIn(TheBuffer && buffer) {

}

还有其他方法可以很好地适应调用。