- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 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_[...]
部分,它就会起作用。
我怎样才能让它工作?
最佳答案
您从未定义过sign_
。事实上,你不需要它:
char_[_1 = phx_getsign(_val)]
但我不会将方钉强行插入圆孔中。如果您需要那种级别的控制,请制作一个原始生成器来执行它。事实上,IO 流操纵器已涵盖:
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/spirit/include/karma.hpp>
#include <iomanip>
namespace bsk = boost::spirit::karma;
namespace bpt = boost::posix_time;
template <typename It = boost::spirit::ostream_iterator>
struct TimeDurationGenerator : bsk::grammar<It, bpt::time_duration()>
{
TimeDurationGenerator() : TimeDurationGenerator::base_type(start_) {
duration_ = bsk::stream;
start_ = duration_;
}
private:
struct wrap {
bpt::time_duration d;
wrap(bpt::time_duration const& d) : d(d) {}
friend std::ostream& operator<<(std::ostream& os, wrap const& w) {
return os << std::setfill('0') << std::internal
<< std::setw(3) << std::showpos << w.d.hours() << ":"
<< std::setw(2) << std::noshowpos << std::abs(w.d.minutes());
}
};
bsk::rule<It, bpt::time_duration()> start_;
bsk::rule<It, wrap()> duration_;
};
int main() {
for (auto str : { "-7:30", "7", "323:87:13" }) {
std::cout << format(TimeDurationGenerator<>{}, bpt::duration_from_string(str)) << "\n";
}
}
打印
-07:30
+07:00
+324:27
关于c++ - 使用 Boost Karma 打印 boost::posix_time::time_duration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48651731/
我想计算 boost::posix_time:ptime 中两个时间戳之间的时间差(以秒为单位)。但是,由于 timestamp 最多包含微秒,结果可能会出乎我的意料。 boost::posix_ti
我正在使用 boost::posix_time 来实现时钟。 date d(2000,Jan,20); ptime start(d); time_iterator titr(start,microse
我有以下代码从 posix_time 获取 UNIX 时间 boost::posix_time::ptime time1(boost::gregorian::date(9999,12,31)); bo
我想转换一个 time_duration到 DATE格式,即自1899年以来的天数、12、30。 DATE date_from_duration(time_duration td) { doub
我想通过网络传输 boost::posix_time::ptime 作为 boost::int64_t。根据A way to turn boost::posix_time::ptime into an
我正在使用 boost::posix_time::ptime 来测量我的模拟运行时间和其他东西。 假设 boost::posix_time::ptime start, stop; boost::pos
可以通过 total_microseconds 方法从 time_duration 中获取总微秒数,但我不知道如何根据该数字重新构建 time_duration。文档中似乎没有用于此目的的构造函数,我
考虑这段代码(使用 VS2015 编译,使用 boost 1.60: #include #include #include int main( int argc, char* argv[] )
我知道我可以使用 boost::gregorian::date_duration 作为以天为单位的时间间隔,使用 boost::posix_time::time_duration 作为时间间隔,但是有
您好,我正在使用 boost Posix 时间系统。我有课 class event{ private: boost::posix_time::ptime time; //some other stuu
我正在尝试为 boost::posix_time::duration 编写一个简单的生成器以在另一个生成器中使用。现在对我来说关键是我想打印的“+”或“-”。到目前为止我所拥有的是: struct G
我正在尝试将 boost::posix_time::time_duration 对象转换为 "%H%M"形式的 string。问题是对话是不工作就好像它不存在一样。 我用来将 Duration 转换为
下面这段代码: auto td = boost::posix_time::seconds(1); auto seconds = td.seconds(); // (*) std::cout << se
我是一名优秀的程序员,十分优秀!