如何使用boost::algorithm::ends_with()作为boost::asio::可变_缓冲区和boost::asio::const_缓冲区迭代器范围?
考虑这一功能:如何使用boost::algorithm::ends_with()作为boost::asio::可变_缓冲区和boost::asio::const_缓冲区迭代器范围?,boost,Boost,考虑这一功能: std::size\t DoReadUntil(常量boost::asio::可变缓冲区和缓冲区,常量boost::asio::常量缓冲区和delim) { boost::system::error\u code error; 常量boost::asio::可变缓冲区1(buffer.data(),1); 标准:尺寸=0; 对于(;;) { boost::asio::read(m_serialPort,buffer_1,错误); auto-itRange1=boost::make
std::size\t DoReadUntil(常量boost::asio::可变缓冲区和缓冲区,常量boost::asio::常量缓冲区和delim)
{
boost::system::error\u code error;
常量boost::asio::可变缓冲区1(buffer.data(),1);
标准:尺寸=0;
对于(;;)
{
boost::asio::read(m_serialPort,buffer_1,错误);
auto-itRange1=boost::make_iterator_range(boost::asio::buffer_sequence_begin(buffer),boost::asio::buffer_sequence_end(buffer));
auto-itRange2=boost::make_iterator_range(boost::asio::buffer_sequence_begin(delim),boost::asio::buffer_sequence_end(delim));
if(boost::algorithm::以(itRange1,itRange2)结尾)
打破
}
DOSETLASTEROR(错误);
返回ret;
}
调用时我收到一个编译器错误:boost::algorithm::ends_with()
,错误消息如下:
C:\msys32\mingw32\include\boost\algorithm\string\compare.hpp | 43 |错误:与“operator==”不匹配(操作数类型为“const boost::asio::mutable_buffer”和“const boost::asio::const_buffer”)
我的代码有什么问题
是否有人可以用()替换boost::algorithm::ends_
我可以试试吗
TIA.
可变缓冲区
具有data()
成员函数,该函数指向数据缓冲区。它还有size
方法来指示缓冲区的大小
您可以使用这两者来创建范围:[data(),data()+size())
data()
返回void*
,因此需要将其强制转换为char*
:
#include <boost/asio.hpp>
#include <boost/algorithm/string/predicate.hpp>
int main() {
std::vector<int> v{1,2,3};
std::vector<int> v2{2,3};
auto buffer = boost::asio::buffer(v);
auto delim = boost::asio::buffer(v2);
auto itRange1 = boost::make_iterator_range((char*)buffer.data(), (char*)buffer.data() + buffer.size());
auto itRange2 = boost::make_iterator_range((char*)delim.data(), (char*)delim.data() + delim.size());
if (boost::algorithm::ends_with(itRange1, itRange2)) {
puts("true"); // printed on console
}
return 0;
}
#包括
#包括
int main(){
std::向量v{1,2,3};
std::向量v2{2,3};
自动缓冲=boost::asio::buffer(v);
auto-delim=boost::asio::buffer(v2);
auto itRange1=boost::生成迭代器范围((char*)buffer.data(),(char*)buffer.data()+buffer.size());
auto-itRange2=boost::make_iterator_range((char*)delim.data(),(char*)delim.data()+delim.size());
if(boost::algorithm::以(itRange1,itRange2)结尾){
puts(“true”);//打印在控制台上
}
返回0;
}
您的版本不起作用,因为
buffer\u sequence\u begin
formutable\u buffer
返回mutable\u buffer*
-指针。因此,您希望比较mutable\u buffer实例,但它们不支持比较。确实,您的解决方案可行。只是buffer\u sequence\u begin
和buffer\u sequence\nd
拖住了我,在这里毫无用处。回答得好。我不敢相信你在那里写了C风格的重新解释转换。我认为这不是一个好主意,甚至不是必需的。这里有buffer\u cast
,你甚至可以直接使用buffer迭代器:另一种选择是使用buffer\u cast
和string\u view::ends\u with
很好的措施:@sehe,感谢您的澄清,但是关于buffer\u cast
,文档中说它已被弃用,我们应该使用data()
成员函数。为什么我应该从您的代码中使用buffers\u begin
和buffers\u end
,而不是直接使用data()
和data()+size()
?TIA.@sehe你说得对,这个演员阵容很难看:)但是为了我的辩护,我很匆忙:D我以前从未使用过缓冲区\u begin/end
,很好。总是有新东西要学。