4

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

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

3 回答 3

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_stringBoost Tokenizer不区分iteratorand const_iterator,所以结果operator*总是const

于 2011-05-04T18:57:34.007 回答
1

*itr实际上会返回 abasic_string而不是 a 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);
   }   
}

我不喜欢将 a 的内存地址传递string给另一个函数的想法。考虑通过副本或引用传递它。

于 2011-05-04T18:58:11.717 回答
0

对不起,这是不可能的。

这正是“将字符串参数作为std::string规则错误的原因。boost::iterator_range<const char*>当模板不合适时(例如单独编译)会更好。

于 2011-05-04T18:55:43.170 回答