ndarray
と呼ばれる数値配列のクラスを設計しました。これは基本的に倍精度配列メンバーdouble *data
を含んでいます。私は数学関数double log(double)
をオーバーロードしてクラスの友人であり、入力ndarray
オブジェクトで呼び出されたとき、入力配列の対数を持つ入力配列と同じサイズのndarray
というオブジェクトを返します。 double fun(double)
という形式のすべての数学関数に対して同じコードを書き換えたくないので、どのようにしてそれらのすべてを同時にオーバーロードできますか?数値配列のクラスに対して同時にすべての数学関数をオーバーロードする方法
0
A
答えて
2
1つの方法は、各要素に関数を適用して結果を返すためにndarrayクラスにメンバーを追加することです。これはすべての数学関数をオーバーロードしませんが、ndarray.apply(sin)
のようなことをさせることができます。おそらく、以下の(未テスト)のようなもの:私はC++ 11 auto
を使用して、私はあなたのタイプがどのように動作するかについていくつかの仮定を行うが、あなたがC++ 11せずにこれを実装することができ、上記で
class myNdarray
{
template <typename T>
myNdarray apply(T func) const
{
myNdarray ret(*this);
for (auto& elm: ret) elm = func(elm);
return ret;
}
};
また、テンプレートタイプT
を削除して、明示的な型を指定することもできます(たぶん1つのdoubleを取る関数とdoubleを返すほうが安全です)。
1
C++は共変の継承または集約をサポートしていないため、残念ながら、このような単純な方法はありません。
これは先進的なboost::mpl
の魔法で行うことができますが、代わりにstd::valarray
を使用することをおすすめします。必要なものだけでなく、遅延実行最適化機能も備えています。唯一の欠点は、利用可能な数学的方法の量が限られていることです。最初に完全な説明を調べて、必要なものがすべてあることを確認してください。
関連する問題
- 1. PHP関数を配列に対して同時に実行するには?
- 2. 同じクラス名を持つすべての要素に対してjavascript関数を呼び出す方法
- 3. 配列w/oループのすべてのキーに対して関数を実行
- 4. 配列とクラスに関する数学的誤差
- 5. 関数のオーバーロード時のオーバーロード時のエラーcmath関数C++
- 6. 数学関数を別の数学関数に適用する
- 7. 配列の各要素に対して `inout`引数を指定して関数を呼び出す方法は?
- 8. セル配列のすべての値を数値配列にダンプします
- 9. 配列に数学関数を適用しますか?
- 10. クラス継承の変数を同じ変数で正しくオーバーロードする方法
- 11. 複数の値を同じ配列に追加する方法
- 12. C#:テキストボックスから関数に数学関数を渡す方法
- 13. クラス内の数値に対して複数のクラスを持つ要素をチェックする方法
- 14. C:関数から数値の配列を返す方法
- 15. Python3でThreadクラスの__init__関数をオーバーロードする方法は?
- 16. クラスのインスタンスからメンバ関数をオーバーロードする方法
- 17. Typescript配列値をクラス変数に変換する方法
- 18. Typescript子クラスの関数オーバーロード
- 19. Numpy、配列の要素を別の配列の対応する数値に従って繰り返す方法
- 20. 変数を関数に渡す前に、childsnapshotsから変数にすべての値を取得する方法
- 21. ArrayListの各オブジェクトに数学関数を適用する方法
- 22. 配列内の0の値に対してJavaScript関数が機能しない
- 23. Azure関数にURLパラメータとして配列を渡す方法
- 24. 関数を介して2D配列に値を格納する
- 25. 複数のクラスを同じ関数で区別する方法
- 26. 空の配列を関数に渡し、その関数に値を入力して値を返す例
- 27. 配列、クラス、関数
- 28. 特定のタイプのリストに対して関数がオーバーロードされています
- 29. matplotlibの対数プロットで学術数値のフォントを設定する方法は?
- 30. クラスの関数を返す配列を作成してメインに呼び出して保存する方法
これは 'std :: transform'の定義です – Ap31