c – 提升精神:如何转换基本类型?

c – 提升精神:如何转换基本类型?,第1张

概述假设我有一个std :: string属性,但为了便于解析,我想使用qi :: int_或qi :: double_. 有一种简单的方法可以将转换作为语义 *** 作吗? 我试过这样的事情: std::stringstream ss; my_int_as_str = qi::int_ [ ref(ss)<<_1; _val=ss.str() ]; 但这甚至不会编译. 编辑 – 尝试下面的回答 #inc 假设我有一个std :: string属性,但为了便于解析,我想使用qi :: int_或qi :: double_.

有一种简单的方法可以将转换作为语义 *** 作吗?

我试过这样的事情:

std::stringstream ss;  my_int_as_str = qi::int_ [ ref(ss)<<_1; _val=ss.str() ];

但这甚至不会编译.

编辑 – 尝试下面的回答

#include <iostream>#include <string>#include <vector>#include <boost/spirit/include/qi.hpp>namespace qi=boost::spirit::qi;namespace phx=boost::phoenix;int main(int argc,char* argv[]){    std::string test="123";    std::string result;    // 1. qi::raw[ qi::int_ ]       works    // 2. qi::lexeme[ qi::int_ ]    doesn't    // 3. qi::as_string[ qi::int_ ] doesn't    qi::rule<std::string::const_iterator,std::string()> my_int_as_str =                    qi::raw[ qi::int_ ];    parse( test.cbegin(),test.cend(),my_int_as_str,result );    std::cout << result << std::endl;    // -------------------------------------------------------------------------    std::string test_vector="456 789";    std::vector<std::string> result_vector;    // 4. qi::raw[ qi::int_ ]       won't compile    // 5. qi::lexeme[ qi::int_ ]    won't compile    // 6. qi::as_string[ qi::int_ ] doesn't    qi::rule<std::string::const_iterator,std::vector<std::string>(),qi::space_type>             my_int_as_str_vector = qi::lexeme[ qi::int_ ];    phrase_parse(test_vector.cbegin(),test_vector.cend(),my_int_as_str_vector,qi::space,result_vector);    for(auto& string: result_vector)        std::cout << string << std::endl;    return 0;}
解决方法 您可以通过专门为您的类型 transform_attribute使用 attr_cast.

#include <iostream>#include <string>#include <vector>#include <boost/spirit/include/qi.hpp>namespace qi=boost::spirit::qi;namespace phx=boost::phoenix;namespace boost { namespace spirit { namespace traits{    template <>    struct transform_attribute<std::string,int,qi::domain>    {        typedef int type;        static int pre(std::string& d) { return 0; }//not useful in this case but required to avoID compiler errors        static voID post(std::string& val,int const& attr) //`val` is the "returned" string,`attr` is what int_ parses        {            std::stringstream ss;            ss << attr;            val= ss.str();        }        static voID fail(std::string&) {}    };}}}int main(int argc,char* argv[]){    std::string test="123";    std::string test_vector="456 789";    qi::rule<std::string::const_iterator,std::string()> my_int_as_str = qi::attr_cast(qi::int_);    qi::rule<std::string::const_iterator,qi::space_type> my_int_as_str_vector= *qi::attr_cast(qi::int_);    std::string result;    std::vector<std::string> result_vector;    parse(test.cbegin(),result);    phrase_parse(test_vector.cbegin(),result_vector);    std::cout << result << std::endl;    for(auto& string: result_vector)        std::cout << string << std::endl;    return 0;}

如果你真的需要/想要使用semantic actions,那么最简单的替代方法是定义一个以int作为参数并返回一个字符串的函数(这比attr_cast替代方案更简单,但它也更慢,几乎是我真正简单基准测试时间的两倍):

std::string semantic_transform(int i){    std::stringstream ss;    ss<<i;    return ss.str();}...std::string string_semantic;qi::parse(test.cbegin(),qi::int_[&semantic_transform],string_semantic);std::cout << string_semantic << std::endl;
总结

以上是内存溢出为你收集整理的c – 提升精神:如何转换基本类型?全部内容,希望文章能够帮你解决c – 提升精神:如何转换基本类型?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1219785.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存