В boost, как передать boost итератор в функцию, как-то приведённую в std :: string - PullRequest
4 голосов
/ 04 мая 2011

См. Конкретный вопрос в виде комментария в конце следующего кода.

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 ]

2 голосов
/ 04 мая 2011

boost::tokenizer<boost::escaped_list_separator<char> >::iterator не является указателем на std::string, но вы можете превратить его в std::string const * с помощью

&(*itr)

Если указатель const не тот, который вы должны передать, вы можете сделать

std::string s(*itr);

и pass &s, в зависимости от семантики владения fn_that_receives_pointer_to_std_string. Boost Tokenizer не различает iterator и const_iterator, поэтому результат operator* всегда равен const.

1 голос
/ 04 мая 2011

*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 другой функции. Рассмотрите возможность передачи его по копии или по ссылке.

0 голосов
/ 04 мая 2011

Извините, это невозможно.

Именно поэтому правило "принимать строковые параметры как std::string" неверно.boost::iterator_range<const char*> может быть лучше, если шаблон не подходит (например, отдельная компиляция).

...