簡體   English   中英

如何正確地提高壓力::可選 <std::chrono::duration> 作為函數參數?

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

我需要一個函數接受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);

有什么辦法可以讓我的函數完全接受boost::optional
任何代表/期間?

在我的實際用例中,該函數將需要接受這些可選持續時間的倍數,因此默認值對我不起作用。

#include "boost/optional.hpp"
#include <chrono>
#include <iostream>

void foo(boost::optional<std::chrono::milliseconds> duration)
{
    if (duration)
        std::cout << duration->count() << "ms\n";
    else
        std::cout << "none\n";
}

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> ,則需要再添加一個重載並將所有內容模板化。 另外,您還需要確定要提高默認值的RepPeriod boost::none

#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 << "none\n";
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM