2016-11-24 8 views
4

を検討の期間コード以下:コンパイラが異なるため、引数の型のstd::minの正しいバージョンをインスタンス化することはできませんのでの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<milliseconds>を使用して明示的にタイプを指定することは可能です。このコードの将来のバージョンでは、タイプは異なります。正確な継続時間の種類を知らなくてもそれを行う一般的な方法は何ですか?

+0

を(http://en.cppreference.com/w/cpp/algorithm/ min)を( '' std :: chrono :: duration')(http://en.cppreference.com/w/cpp/chrono/duration)(そしてそこにはありません) ")方法。そのような専門化を自分で行うことを除いて。そして、あなたが2つ以上の場所でそれを必要とするならば、そのような専門化は良いアイデアかもしれません。 –

+2

[std :: min](http://en.cppreference.com/w/cpp/algorithm/min)には、異なる引数型を受け付けるバージョンはありません。引数のいずれかまたは両方をキャストします。 –

+0

私は質問を変更して、ジェネリックコードの必要性が明示的に示されるようにします。 –

答えて

8

は、あなたが彼らの共通の型、に両方の期間を変換し、それらの値の最小値を見つけることができる2つの期間、D1 d1D2 d2 ...

を考えます。

std::min<std::common_type_t<D1, D2>>(d1, d2)に電話し、必要に応じてそのタイプに変換できるようにしてください。

これはstd::common_typedurationタイプの正しいことを行うために特殊化されているためです(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

あなたは次の関数を使用することができます:[ `のstd :: min`]の無指定し、既存の専門がありません場合は

#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

残念ながら、1つの回答を正しいものとしてマークすることはできます。正確なコードをありがとう! –

関連する問題