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

时间:2011-05-04 18:51:45

标签: c++ boost stdstring boost-iterators

在以下代码的末尾以具体问题的形式查看。

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

3 个答案:

答案 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无法区分iteratorconst_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*>会更好(例如,单独编译)。