在 boost 中,如何将 boost 迭代器传递给以某种方式转换为 std::string 的函数
请参阅以下代码末尾的注释作为具体问题。
std::string s("my sample string \"with quotes\"");
boost::escaped_list_separator<char>
els(""," ","\"\'");
boost::tokenizer<boost::escaped_list_separator<char> >::iterator
itr;
boost::tokenizer<boost::escaped_list_separator<char> >
tok(s, els);
itr=tok.begin();
if (itr!=tok.end())
fn_that_receives_pointer_to_std_string(itr); // <---- IS IT POSSIBLE TO SEND POINTER AND NOT HAVE TO CREATE A NEW STRING ??
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
boost::tokenizer; >::iterator
不是指向std::string
的指针,但您可以使用If a
将其转换为
指针不是您必须传递的内容,您可以执行std::string const *
>const并传递
&s
,具体取决于fn_that_receives_pointer_to_std_string
。 Boost Tokenizer 不区分iterator< /code> 和 const_iterator,因此
operator*
的结果始终是const
。boost::tokenizer<boost::escaped_list_separator<char> >::iterator
is not a pointer tostd::string
, but you can turn it intostd::string const *
withIf a
const
pointer is not what you must pass, you may be able to doand pass
&s
, depending on the ownership semantics offn_that_receives_pointer_to_std_string
. Boost Tokenizer does no distinguish betweeniterator
andconst_iterator
, so the result ofoperator*
is alwaysconst
.*itr
实际上会返回一个basic_string
而不是string
,因此您需要将一个转换为另一个:我不喜欢这个想法将
字符串
的内存地址传递给另一个函数。考虑通过副本或引用传递它。*itr
will actually return abasic_string
instead of astring
, so you need to convert one to another:I don't like the idea to passing the memory address of a
string
to another function. Consider passing it by copy or by reference.抱歉,这是不可能的。
这正是规则 " 将字符串参数视为
std::字符串
" 是错误的。当模板不合适时(例如单独编译),boost::iterator_range
可能会更好。Sorry, it's impossible.
It's exactly the reason why the rule "take string parameters as
std::string
" is wrong.boost::iterator_range<const char*>
can be better when a template is inappropriate (separate compilation for example).