有一种简单的方法可以将转换作为语义 *** 作吗?
我试过这样的事情:
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 – 提升精神:如何转换基本类型?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)