如何正确地将 boost::optional<std::chrono::d uration> 作为函数参数?

How to properly take a boost::optional<std::chrono::duration> as a function parameter?

本文关键字:gt uration 函数 参数 chrono optional 正确地 boost lt std      更新时间:2023-10-16

我需要一个函数来接受boost::optional<std::chrono::duration>。我希望能够传递它,例如,std::chrono::millisecondsstd::chrono::secondsboost::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的默认RepPeriod

#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