ハスケルのような機能指向言語では、パラメータ定義のいくつかの軸に関数定義をオーバーロードすることができます。 C++は、引数の数と型をサポートしています。階乗の定義は、引数は階乗の定義から0異なりですパラメータ値に基づいて関数シグネチャのマッチングを実行する方法はありますか?
factorial :: (Integral a) => a -> a
factorial 0 = 1
factorial n = n * factorial (n - 1)
:他の言語には、例えば、引数の値とさえガード条項(。条件の引数をテストコード)Haskellでは、階乗の実装をサポート引数が他の整数の場合
私はC++でこの機能を見つけられず、最初はその言語で実装するのが難しいと考えました。私はそれが実際にはかなり簡単で言語に素敵なものになると思ったので、私はそれを見逃さなければなりません。
ネイティブ構文またはテンプレートでこれを行う方法はありますか?
C++テンプレートは、整数定数に特化することができます。これは、Haskellの例とほぼ同じです。 [C++で特別なテンプレートで書かれた階乗関数です](http://stackoverflow.com/q/3082113/464709)。 –
はい、コンパイル時にパラメータ値がわかっている場合にのみ、テンプレートのメタプログラミングで行うことができます。 C++では、仮想メソッドディスパッチ以外の実行時にパラメータ値をディスパッチできません。 – antlersoft
これは2つのオーバーロードされた関数ではなく、 'factorial x = case x of 0 => 1の関数です。 n => n *階乗(n - 1) 'のようになります。 – molbdnilo