2011-05-04 52 views
4

以某種方式作爲註釋在下面的代碼結尾處看到具體問題。在boost中,如何將boost迭代器傳遞給函數以某種方式作爲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 ?? 

回答

2

boost::tokenizer<boost::escaped_list_separator<char> >::iterator不是指向std::string,但你可以

&(*itr) 

如果const指針是不是把它變成std::string const *你必須傳遞什麼,你可能能夠做到

std::string s(*itr); 

並通過&s,具體取決於fn_that_receives_pointer_to_std_string的所有權語義。 Boost Tokenizer沒有區分iteratorconst_iterator,因此operator*的結果始終爲const

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的內存地址給另一個函數。考慮通過複製或引用傳遞它。

相關問題