2013-05-11 15 views
8

一般的な最小限の関数を書くと、2つの質問が私の心に浮かんだ。コードは、任意の入力タイプと異なる引数の数と正常に動作します:一般minとmax - C++

namespace xyz 
{ 

template <typename T1, typename T2> 
auto min(const T1 &a, const T2 &b) -> decltype(a+b) 
{ 
    return a < b ? a : b; 
} 

template <typename T1, typename T2, typename ... Args> 
auto min(const T1 &a, const T2 &b, Args ... args) -> decltype(a+b) 
{ 
    return min(min(a, b), args...); 
} 

} 

int main() 
{ 
    cout << xyz::min(4, 5.8f, 3, 1.8, 3, 1.1, 9) << endl; 
    //     ^ ^  ^
    //     |  |   | 
    //     float double  int 
} 

 

  • decltype(a+b)のためのより良い代替はありますか?私には、覚えていない標準クラスがあります。decltype(std::THE_RESULT<a,b>::type)のようなものです。

  • decltype(std::THE_RESULT<a,b>::type)の戻り値の型はconst &ですか?

+1

あなたが、AとBは、異なるタイプであることを許可するように私には奇妙に思えます。これは 'min(42、" three ")'のような無意味な比較のための扉を開きます。なぜ両方のパラメータ(と戻り値)も同じ型である必要はありませんか? –

+1

@AdrianMcCarthy:_ "算術型の場合、共通型は、T0()+ T1()+ ... + Tn()" _などの(おそらく混合モードの)算術式の型として見ることもできます。だから私は、 'min(42、" three ")'を使うことは禁じられていると思います。コンパイルエラーです。 – deepmax

+0

ところで、テンプレートを使ってマクロバージョンの良い部分を再現する記事があります。それは驚くほどたくさんあります。 – chris

答えて

13

std::common_typec++11):

std::common_type非専門、T2、各ペアT1間 一般的なタイプを決定するためのルールが正確 ための規則は、の戻り型を決定しているために三次条件付き演算子であり、 T1およびT2は、第2および第3オペランドの型です。算術タイプについて

、一般的なタイプは、(おそらく混合モード)の種類 として見ることができるようT0() + T1() + ... + Tn().

ていないわからとして演算式const&がありますが、答えはstd::remove_cvstd::remove_reference(そして答えはstd::is_reference)です。

実際には、here'sタイプサポートユーティリティのリスト。自分をノックアウトしてください。

+0

ありがとうございました。それを見てもらえますか? – deepmax

+2

@MM。それはうまくいくでしょうが、私が思っているものは完全にはありません。 '(1,2,1.1)'に対して 'int'を返します。 'decltype(min(1、2))'です。あなたは 'decltype(min(min(a、b)、args ...))'のように全てをカバーすることができますが、今は 'gcc'では動作しません。私はバグだと思う。 – stardust

+0

@名前付き:はい、私はそれをテストした、あなたは正しいです。 – deepmax

5

答え、私は以下のようにそれをやった価値がコメントした後:

template <typename T1, typename T2> 
auto min(const T1 &a, const T2 &b) 
-> typename std::common_type<const T1&, const T2&>::type 
{ 
    return a < b ? a : b; 
} 

template <typename T1, typename T2, typename ... Args> 
auto min(const T1 &a, const T2 &b, const Args& ... args) 
-> typename std::common_type<const T1&, const T2&, const Args& ...>::type 
{ 
    return min(min(a, b), args...); 
} 
関連する問題