4

TR1 によって C++11 に導入された新しい関数の多くは、醜い C ライクなシグネチャを持っています。たとえば、Boost の TR1 のドキュメント ( http://www.boost.org/doc/libs/1_52_0/doc/html/boost_tr1/subject_list.html#boost_tr1.subject_list.special )を引用します。

// [5.2.1.1] associated Laguerre polynomials:
double assoc_laguerre(unsigned n, unsigned m, double x);
float assoc_laguerref(unsigned n, unsigned m, float x);
long double assoc_laguerrel(unsigned n, unsigned m, long double x);

明らかに、いくつかのテンプレート化された実装 (実際には、Boost のこれらの関数の "ネイティブ" シグネチャです)、または複数の識別子の代わりに少なくともいくつかのオーバーロードを好むでしょう。

C との互換性を目指すということは、これらの識別子をサポートすることを意味することは理解できますが、これは純粋な C++ スピーカーにとって厄介なことです。に加えて、より自然なインターフェイスを備えた<cmath>がいくつか存在する可能性があります。<math>

私が見逃しているのは何ですか (さらに、おそらく以前に尋ねられた質問のいくつか)

4

1 に答える 1

4

Boostについては知りませんが、すべての標準関数に <cmath>は3つの標準タイプのオーバーロードがあるため、次のようになります。

double cos(double);
float cos(float);
long double cos(long double);

Cの代わりに:

double cos(double);
float cosf(float);
long double cosl(long double);

オーバーロードの代わりに関数テンプレートが必要な理由がよくわかりません。ほとんどの数学関数では、一般的な実装はできません。正しい実装は、型ごとに異なる精度、丸め規則などに依存します。したがって、代替手段は、汎用実装のないテンプレート関数と、3 つの特殊化です。そして、それは「より単純な」オーバーロードされた関数よりもあなたに何をもたらしますか?

于 2013-02-01T10:41:53.857 に答える