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

发布于 2024-11-05 06:22:10 字数 503 浏览 0 评论 0 原文

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

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

See specific question as a comment at the end of the following code.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

奶茶白久 2024-11-12 06:22:10

boost::tokenizer; >::iterator 不是指向 std::string 的指针,但您可以使用

&(*itr)

If a 将其转换为 std::string const * >const 指针不是您必须传递的内容,您可以执行

std::string s(*itr);

并传递 &s,具体取决于fn_that_receives_pointer_to_std_stringBoost Tokenizer 不区分 iterator< /code> 和 const_iterator,因此 operator* 的结果始终是 const

boost::tokenizer<boost::escaped_list_separator<char> >::iterator is not a pointer to std::string, but you can turn it into std::string const * with

&(*itr)

If a const pointer is not what you must pass, you may be able to do

std::string s(*itr);

and pass &s, depending on the ownership semantics of fn_that_receives_pointer_to_std_string. Boost Tokenizer does no distinguish between iterator and const_iterator, so the result of operator* is always const.

风为裳 2024-11-12 06:22:10

*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);
   }   
}

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

*itr will actually return a basic_string instead of a string, so you need to convert one to another:

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);
   }   
}

I don't like the idea to passing the memory address of a string to another function. Consider passing it by copy or by reference.

飘落散花 2024-11-12 06:22:10

抱歉,这是不可能的。

这正是规则 " 将字符串参数视为 std::字符串" 是错误的。当模板不合适时(例如单独编译),boost::iterator_range 可能会更好。

Sorry, it's impossible.

It's exactly the reason why the rule "take string parameters as std::string" is wrong. boost::iterator_range<const char*> can be better when a template is inappropriate (separate compilation for example).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文