gpt4 book ai didi

c++ - 使用 boost::range 创建一个 unindent 算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:02:52 25 4
gpt4 key购买 nike

我正在为文本编辑器创建一个不缩进算法。我已经设法获得要操作的范围,但是当我想执行 Gtk::TextBuffer::erase 时,它​​失败了:

void unindentSelection(const Glib::RefPtr<Gtk::TextBuffer> &buffer)
{
Gtk::TextBuffer::iterator start, end;

buffer->get_selection_bounds(start, end);

auto selRange = boost::make_iterator_range(start, end);
auto buffRange = boost::make_iterator_range(buffer->begin(), buffer->end());

auto prevRangeRev = boost::make_iterator_range(buffRange.begin(), selRange.begin()) | boost::adaptors::reversed;
auto prevRangeLineRev = boost::find<boost::return_begin_found>(prevRangeRev, '\n');
auto prevRangeLine = prevRangeLineRev | boost::adaptors::reversed;

auto afterRange = boost::make_iterator_range(selRange.end(), buffRange.end());
auto afterRangeLine = boost::find<boost::return_begin_found>(afterRange, '\n');

auto exSelRangeAux = boost::join(prevRangeLine, selRange);
auto exSelRange = boost::join(exSelRangeAux, afterRangeLine);

show_range(exSelRange);

while (true)
{
auto spaceRange = boost::find_if<boost::return_begin_found>(exSelRange, findNonspaceNL);

if (boost::distance(spaceRange))
{
buffer->erase(spaceRange.begin(), spaceRange.end());
}
}
}

TextEditor.cpp:501:31: 错误:无法从 'boost::range_detail::join_iterator >, Gtk::TextIter, unsigned int, unsigned int, boost::iterators::bidirectional_traversal_tag>, Gtk::TextIter, unsigned int, unsigned int, boost::iterators::bidirectional_traversal_tag>' to 'const iterator' (aka 'const Gtk::TextIter') buffer->erase(spaceRange.begin(), afterRangeLine.end()); ^~~~~~~~~~~~~~~~~~/usr/include/gtkmm-3.0/gtkmm/textiter.h:145:7: 注意:候选构造函数(隐式复制构造函数)不可行:没有来自 'boost::range_detail::join_iterator >, Gtk::TextIter 的已知转换, unsigned int, unsigned int, boost::iterators::bidirectional_traversal_tag>, Gtk::TextIter, unsigned int, unsigned int, boost::iterators::bidirectional_traversal_tag>' to 'const Gtk::TextIter &' 第一个参数类 TextIter ^/usr/include/gtkmm-3.0/gtkmm/textiter.h:145:7: 注意:候选构造函数(隐式移动构造函数)不可行:没有来自 'boost::range_detail::join_iterator >, Gtk::TextIter 的已知转换, unsigned int, unsigned int, boost::iterators::bidirectional_traversal_tag>, Gtk::TextIter, unsigned int, unsigned int, boost::iterators::bidirectional_traversal_tag>' 到 'Gtk::TextIter &&' 第一个参数类 TextIter ^/usr/include/gtkmm-3.0/gtkmm/textbuffer.h:378:34: 注意:在此处将参数传递给参数“range_begin” 迭代器删除(const iterator& range_begin, const iterator& range_end);

有什么想法吗?

最佳答案

我必须使用“boost::iterator_facade”创建一个迭代器类型,其中包含一个模板化的“Iterator it”(在我的例子中是 Gtk::TextIter)。迭代器的所有操作都转发给“it”,除了运算符*(),它只是给出了普通的迭代器。所以删除是这样进行的:

buffer->erase(*spaceRange.begin(), *spaceRange.end());

这种新型迭代器在处理范围时非常有用。不确定这是最好的解决方案,但有效。

关于c++ - 使用 boost::range 创建一个 unindent 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31661020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com