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::stringstd::string const *

&(*itr)

ポインタが渡さなければならないものでない場合は、次のconstことができる場合があります

std::string s(*itr);

&sの所有権セマンティクスに応じて、を渡しfn_that_receives_pointer_to_std_stringます。Boost Tokenizerはとを区別しないiteratorためconst_iterator、の結果operator*は常にconstです。

于 2011-05-04T18:57:34.007 に答える
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);
   }   
}

stringaのメモリアドレスを別の関数に渡すというアイデアは好きではありません。コピーまたは参照で渡すことを検討してください。

于 2011-05-04T18:58:11.717 に答える
0

申し訳ありませんが、それは不可能です。

「文字列パラメーターを次のように受け取る」std::stringというルールが間違っているのは、まさにそのためです。boost::iterator_range<const char*>テンプレートが不適切な場合 (たとえば、別のコンパイル) の方が適切な場合があります。

于 2011-05-04T18:55:43.170 に答える