我正试图从boost :: spirit规则定义的动作中引用(尚未)未知实例的成员,因此在伪代码中,
而不是double_ [ref(rN)= _1]我正在寻找类似X**ppx的东西; double_ [ref(&X :: rN,ppx)= _1]
它的解决方法可能是一个简单的"语义操作",其中一个参数可以知道实例并且可以写入它,就像
qi::rule<Iterator, Skipper> start;
my_grammar(DataContext*& dataContext) : my_grammar::base_type(start) , execContext(execContext) {
start = qi::double_[ boost::bind(&my_grammar::newValueForXY, dataContext, ::_1) ];
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否有可能直接"绑定"到成员变量,就像可以通过使用"phoenix :: ref(...)= value"绑定到"本地"变量一样.
我尝试了以下语法:
start = qi::int_[ boost::bind<int&>(&DataContext::newValueForXY, boost::ref(dataContext))() = ::_1] ];
Run Code Online (Sandbox Code Playgroud)
但是VS2010SP1和错误消息失败了
错误C2440:'=':'boost :: arg'无法转换为...
我正在尝试创建sprintfs'%05d行为的替代品.虽然,我在stackoverflow上发现了一个类似的问题,当我用负数测试时,建议的解决方案对我不起作用.
做一个"sprintf(buf,"%05d", - 12)",我得到"-0012"回来看起来不错.
使用stringstream,width和fill,当从std :: basic_ios :: fill查看文档时,我得到的"00-12"接缝合理
填充字符是输出插入函数在填充结果到字段宽度时填充空格所使用的字符.
但看起来并不像人们想要的那样.
所以我很困惑,不知道我是否做了明显的错误,或者std流中的宽度/填充是否不容易支持这种情况.
可以在键盘上找到可编译的测试代码.以下是基于流的转换的摘录:
std::string NumberToString(const long iVal, const int iNumDigit)
{
std::stringstream ss;
if (iNumDigit >= 0) ss.fill(' ');
else if (iNumDigit < 0) ss.fill('0');
ss.width(std::abs(iNumDigit));
ss << iVal;
return ss.str();
}
Run Code Online (Sandbox Code Playgroud)
编辑1:解决方案:
为了将标准流方法与%05d的printf格式匹配,jrok的解决方案可用于带前导零的情况.这是新功能:
std::string NumberToString(const long iVal, const int iNumDigit)
{
std::stringstream ss;
if (iNumDigit >= 0) ss.fill(' ');
else if (iNumDigit < 0) { ss.fill('0'); ss.setf(std::ios::internal, std::ios::adjustfield); }
ss.width(std::abs(iNumDigit));
ss << …Run Code Online (Sandbox Code Playgroud) 我正在使用boost :: spirit来将文本解析为双精度形式,其演唱形式可能与数字之间用空格分隔。
使用或滥用real_policies时,我找到了解决方案,但不确定是否有更简单的方法来实现。有人可以给我提示吗?
这是相关的代码片段:
template <typename T>
struct real_with_separated_sign_policies : boost::spirit::qi::real_policies<T>
{
// allow skipping chars between a possible sign and a folling real number
template <typename Iterator>
static bool parse_sign(Iterator& first, Iterator const& last)
{
bool ret = qi::extract_sign(first, last);
if (ret)
qi::parse(first, last, *qi::lit(' '));
return ret;
}
};
template <typename Iterator, typename Skipper>
struct RealWithSeparatedSignParser
: qi::grammar<Iterator, double(), Skipper>
{
boost::spirit::qi::real_parser<double, real_with_separated_sign_policies<double> > RealWithSeparatedSignValue;
RealWithSeparatedSignParser() : RealWithSeparatedSignParser::base_type(start)
{
start %= RealWithSeparatedSignValue;
}
qi::rule<Iterator, …Run Code Online (Sandbox Code Playgroud)