一般的な最小限の関数を書くと、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 &
ですか?
あなたが、AとBは、異なるタイプであることを許可するように私には奇妙に思えます。これは 'min(42、" three ")'のような無意味な比較のための扉を開きます。なぜ両方のパラメータ(と戻り値)も同じ型である必要はありませんか? –
@AdrianMcCarthy:_ "算術型の場合、共通型は、T0()+ T1()+ ... + Tn()" _などの(おそらく混合モードの)算術式の型として見ることもできます。だから私は、 'min(42、" three ")'を使うことは禁じられていると思います。コンパイルエラーです。 – deepmax
ところで、テンプレートを使ってマクロバージョンの良い部分を再現する記事があります。それは驚くほどたくさんあります。 – chris