2016-11-24 74 views
4

考慮的持續時間下面的代碼:的std ::性病::時辰分鐘::不同類型

// durations are from std::chrono 
auto a = get_duration_1(); // milliseconds, will vary in future versions 
auto b = get_duration_2(); // seconds, will vary in future versions 
auto c = std::min(a, b); 

它不會編譯,因爲編譯器不能實例化,因爲不同的參數類型的std::min正確版本。

當然,現在可以使用std::min<milliseconds>明確指定類型。在此代碼的將來版本中,類型會有所不同。在不知道確切持續時間類型的情況下,通用的方法是什麼?

+0

如果沒有指定,['標準:: min']現有的專業化(http://en.cppreference.com/w/cpp/algorithm/分鐘)[[std :: chrono :: duration]](http://en.cppreference.com/w/cpp/chrono/duration)(並沒有),那麼沒有沒有通用(和「好「) 辦法。除了自己做這樣一個專業。如果你在多個地方需要它,那麼這樣的專業化可能是一個好主意。 –

+2

[std :: min](http://en.cppreference.com/w/cpp/algorithm/min)沒有接受不同參數類型的版本。要麼拋出其中一個參數,要麼兩者兼有。 –

+0

我更改了問題,以便明確顯示對通用代碼的需求。 –

回答

8

鑑於兩會期間,D1 d1D2 d2 ...

你既可以持續時間轉換爲他們的普通型,,然後找出最小的值。

或者只需撥打std::min<std::common_type_t<D1, D2>>(d1, d2),並根據需要將它們轉換爲該類型。

這是有效的,因爲std::common_type專門爲duration類型做正確的事情,請參閱C++標準中的[time.traits.specializations]。

+1

可以用函數模板包裝,不是嗎?有用的工具,不僅僅是'std :: chrono' – StoryTeller

+0

看起來像一個解決方案。在這個具有'auto'變量的特定情況下,我應該做'std :: common_type '? –

+0

當然可以。在你的情況下,'D1'是'decltype(a)','D2'是'decltype(b)',所以相應地替換。但要小心:這應該是'common_type_t'而不是'common_type' –

5

您可以使用以下功能:

#include <chrono> 

template <typename T1, typename T2> 
auto generic_min(const T1& duration1, const T2& duration2) 
{ 
    using CommonType = typename std::common_type<T1,T2>::type; 
    const auto d1 = std::chrono::duration_cast<CommonType>(duration1); 
    const auto d2 = std::chrono::duration_cast<CommonType>(duration2); 
    return std::min(d1,d2); 
} 
+0

不幸的是,我只能標記一個答案是正確的。謝謝你的確切代碼! –

相關問題