在以下代码的末尾以具体问题的形式查看。
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 ??
答案 0 :(得分:2)
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
。
答案 1 :(得分:1)
*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
的内存地址传递给另一个函数的想法。考虑通过复制或引用传递它。
答案 2 :(得分:0)
抱歉,这是不可能的。
这正是规则"take string parameters as std::string
"错误的原因。当模板不合适时,boost::iterator_range<const char*>
会更好(例如,单独编译)。