在boost中,如何将boost迭代器传递给以某种方式转换为std::string的函数

In boost, how to pass boost iterator to a function somehow casted as std::string

本文关键字:boost 转换 方式 std string 函数 迭代器      更新时间:2023-10-16

将特定问题作为以下代码末尾的注释。

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 ??

boost::tokenizer<boost::escaped_list_separator<char> >::iterator不是指向std::string的指针,但您可以使用

将其转换为std::string const *
&(*itr)

如果const指针不是你必须传递的,你可以做

std::string s(*itr);

并传递&s,这取决于fn_that_receives_pointer_to_std_string的所有权语义。Boost Tokenizer不区分iteratorconst_iterator,所以operator*的结果总是const

*itr实际上将返回basic_string而不是string,因此您需要将它们转换为另一个:

using namespace std;
using namespace boost;
void fn_that_receives_pointer_to_std_string(string* str)
{
    cout << "str: " << *str << endl;
}
int main()
{
   string s = "Field 1,"putting quotes around fields, allows commas",Field 3";
   tokenizer<escaped_list_separator<char> > tok(s);
   for(tokenizer<escaped_list_separator<char> >::iterator beg=tok.begin(); beg!=tok.end();++beg)
   {   
       string tmp(*beg);
       fn_that_receives_pointer_to_std_string(&tmp);
   }   
}

我不喜欢把string的内存地址传递给另一个函数的想法。

对不起,这是不可能的。

这就是为什么规则"把字符串参数作为std::string"是错误的原因。当模板不合适(例如单独编译)时,boost::iterator_range<const char*>可以更好。