将特定问题作为以下代码末尾的注释。
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不区分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
的内存地址传递给另一个函数的想法。
对不起,这是不可能的。
这就是为什么规则"把字符串参数作为std::string
"是错误的原因。当模板不合适(例如单独编译)时,boost::iterator_range<const char*>
可以更好。