如何正确地将 boost::optional<std::chrono::d uration> 作为函数参数?
How to properly take a boost::optional<std::chrono::duration> as a function parameter?
我需要一个函数来接受boost::optional<std::chrono::duration>
。我希望能够传递它,例如,std::chrono::milliseconds
、std::chrono::seconds
或boost::none
。
我有几个解决方案并不能完全达到我想要的效果。
尝试1:
template <class PeriodT>
void foo(boost::optional<std::chrono::duration<int64_t, PeriodT>> duration);
尝试1的问题:
我不能简单地通过std::chrono::duration
甚至boost::none
。要通过boost::none
,我必须执行以下操作:
boost::optional<std::chrono::seconds> input = boost::none;
foo(input);
我无法呼叫
foo(boost::none);
或
std::chrono::seconds input(10);
foo(input);
尝试2:
void foo(boost::optional<std::chrono::milliseconds> duration);
尝试2的问题:
自动转换不会发生。
foo(std::chrono::seconds(10));
不会编译。
foo(std::chrono::milliseconds(10));
将编译,也将编译
foo(boost::none);
有什么方法可以让函数干净地接受任何rep/周期的boost::optional
吗?
在我的实际用例中,函数需要接受这些可选的持续时间中的多个,所以默认值对我来说不起作用
#include "boost/optional.hpp"
#include <chrono>
#include <iostream>
void foo(boost::optional<std::chrono::milliseconds> duration)
{
if (duration)
std::cout << duration->count() << "msn";
else
std::cout << "nonen";
}
void foo(std::chrono::milliseconds duration)
{
foo(boost::optional<std::chrono::milliseconds>{duration});
}
int
main()
{
using namespace std::chrono;
foo(10ms);
foo(10s);
foo(boost::none);
}
如果要接受任何chrono::duration<Rep, Period>
,则需要再添加一个重载并对所有内容进行模板化。此外,您还需要决定boost::none
的默认Rep
和Period
:
#include "boost/optional.hpp"
#include "date/date.h"
#include <chrono>
#include <iostream>
template <class Rep, class Period>
void foo(boost::optional<std::chrono::duration<Rep, Period>> duration)
{
using date::operator<<;
if (duration)
std::cout << *duration << "n";
else
std::cout << "nonen";
}
template <class Rep, class Period>
void foo(std::chrono::duration<Rep, Period> duration)
{
foo(boost::optional<std::chrono::duration<Rep, Period>>{duration});
}
void foo(boost::none_t)
{
foo(boost::optional<std::chrono::seconds>{});
}
int
main()
{
using namespace std::chrono;
foo(10ms);
foo(10s);
foo(boost::none);
}
上面我还使用了霍华德的日期库,以便更容易地打印任意持续时间:
10ms
10s
none
相关文章:
- EASTL矢量<向量<int>>连续的
- std::chrono::d uration 可以按秒初始化,但不能按毫秒初始化?
- 如何正确地将 boost::optional<std::chrono::d uration> 作为函数参数?
- 尝试转换 std::chrono::d uration 会导致"rep cannot be a duration"编译错误
- 将 chrono::d uration 与整数进行比较
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C 字符串比较“祝您好运”&gt;“再见”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 将 chrono::d uration 转换为字符串或 C 字符串
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- 为什么行为 std::chrono::d uration::operator*= 不像内置的 *=?
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy