c – 提升精神:如何转换基本类型?
发布时间:2020-12-16 10:23:18 所属栏目:百科 来源:网络整理
导读:假设我有一个std :: string属性,但为了便于解析,我想使用qi :: int_或qi :: double_. 有一种简单的方法可以将转换作为语义操作吗? 我试过这样的事情: std::stringstream ss; my_int_as_str = qi::int_ [ ref(ss)_1; _val=ss.str() ]; 但这甚至不会编译. 编
假设我有一个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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |