[英]In boost, how to pass boost iterator to a function somehow casted as 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 ??
boost::tokenizer<boost::escaped_list_separator<char> >::iterator
不是指向std::string
的指针,但是您可以将其转换为std::string const *
with
&(*itr)
如果const
指针不是你必须传递的,你可以做
std::string s(*itr);
并传递&s
,具体取决于fn_that_receives_pointer_to_std_string
的所有权语义。 Boost Tokenizer不区分iterator
和const_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
的 memory 地址传递给另一个 function 的想法。 考虑通过副本或引用传递它。
对不起,这是不可能的。
这正是“将字符串参数作为std::string
”规则错误的原因。 boost::iterator_range<const char*>
当模板不合适时会更好(例如单独编译)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.