如何使用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
for
mutable\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
,很好。总是有新东西要学。