我试图通过修改 boost::property_tree 解析的 xml 配置文件来允许设置 std::chrono::duration 报告的单位。我当前的非编译解决方案尝试使用 std::variant 执行此操作。
在 .hpp 类声明中
using TimestampVariant = std::variant<
std::chrono::nanoseconds,
std::chrono::microseconds,
std::chrono::milliseconds,
std::chrono::seconds
>;
TimestampVariant _timestamp_v;
在.cpp中
auto GetTimestampVisitor = [](const auto& t) -> decltype(auto) {
return std::chrono::duration_cast<std::remove_reference_t<decltype(t)>>(std::chrono::system_clock::now().time_since_epoch()).count();
};
void SetupFunction()
{
boost::property_tree::ptree property_tree;
boost::property_tree::read_xml(filepath, property_tree);
auto config = property_tree.get_child("Config");
std::string timestamp_type = config.get<std::string>("ReportingUnits");
if(!timestamp_type.compare("seconds") || !timestamp_type.compare("s"))
{
_timestamp_v = std::chrono::seconds();
}
else if(!timestamp_type.compare("milliseconds") || !timestamp_type.compare("ms"))
{
_timestamp_v = std::chrono::milliseconds();
}
else if(!timestamp_type.compare("microseconds") || !timestamp_type.compare("us"))
{
_timestamp_v = std::chrono::microseconds();
}
else if(!timestamp_type.compare("nanoseconds") || !timestamp_type.compare("ns"))
{
_timestamp_v = std::chrono::nanoseconds();
}
}
void OutputFunction()
{
std::cout << std::visit(GetTimestampVisitor, _timestamp_v) << std::endl;
}
我承认我不擅长元编程。有没有更简单的方法可以做到这一点?本质上,我只能在编译时保证持续时间的类型将是持续时间类型的子集之一。
由于存在通用表示,因此不需要元编程。
只需始终存储具有足够精度的纯文本即可
duration
。然后在输出时缩放到所需的演示格式:在 Coliru 上直播
通过所有测试:
印刷:
现场演示: