【发布时间】:2018-02-06 20:49:40
【问题描述】:
我正在尝试为boost::posix_time::duration 编写一个简单的生成器,以便在另一个生成器中使用。我现在的症结是我想要打印的“+”或“-”。到目前为止我所拥有的是:
struct GetSign
{
template<typename> struct result { typedef char type; };
template<typename TimeDur>
const char operator()(const TimeDur& dur) const
{
return dur.is_negative() ? '-' : '+';
}
};
boost::phoenix::function<GetSign> phx_getsign;
struct TimeDurationGenerator
: boost::spirit::karma::grammar<boost::spirit::ostream_iterator, boost::posix_time::time_duration()>
{
TimeDurationGenerator()
: TimeDurationGenerator::base_type(start_)
{
namespace bsk = boost::spirit::karma;
namespace bpt = boost::posix_time;
start_
= sign_[bsk::_1 = phx_getsign(bsk::_val)]
<< bsk::right_align(2,'0')[bsk::int_[bsk::_1 = boost::phoenix::bind(&bpt::time_duration::hours, bsk::_val)]]
<< ':'
<< bsk::right_align(2,'0')[bsk::int_[bsk::_1 = boost::phoenix::bind(&bpt::time_duration::minutes,bsk::_val)]];
}
boost::spirit::karma::rule<boost::spirit::ostream_iterator, char()> sign_;
boost::spirit::karma::rule<boost::spirit::ostream_iterator, boost::posix_time::time_duration()> start_;
};
虽然这确实编译(至少在 clang 上)但它不起作用,因为没有输出。当我将此生成器包含在另一个生成器中时,输出总是在到达此处时停止。如果我删除规则的 sign_[...] 部分,那么它就可以工作。
我怎样才能让它工作?
【问题讨论】:
标签: c++ boost boost-spirit