【发布时间】:2018-07-20 21:45:25
【问题描述】:
我需要一个函数接受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);
有什么方法可以让函数干净地接受boost::optional
任何代表/期间?
我的实际用例中的函数需要接受多个这些可选持续时间,因此默认值对我不起作用。
【问题讨论】:
-
只使用重载?
-
@o11c 这如何解决我的问题?您是否建议我为我想使用的每个
std::chrono::duration期间定义重载? -
除了
std::chrono::nanoseconds之外,您可能不需要任何具体的持续时间 - 所有其他持续时间都会转换,因为它是无损的。
标签: c++ c++11 templates boost chrono