2016-09-11 6 views
0

ndarrayと呼ばれる数値配列のクラスを設計しました。これは基本的に倍精度配列メンバーdouble *dataを含んでいます。私は数学関数double log(double)をオーバーロードしてクラスの友人であり、入力ndarrayオブジェクトで呼び出されたとき、入力配列の対数を持つ入力配列と同じサイズのndarrayというオブジェクトを返します。 double fun(double)という形式のすべての数学関数に対して同じコードを書き換えたくないので、どのようにしてそれらのすべてを同時にオーバーロードできますか?数値配列のクラスに対して同時にすべての数学関数をオーバーロードする方法

答えて

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

これは 'std :: transform'の定義です – Ap31

1

C++は共変の継承または集約をサポートしていないため、残念ながら、このような単純な方法はありません。

これは先進的なboost::mplの魔法で行うことができますが、代わりにstd::valarrayを使用することをおすすめします。必要なものだけでなく、遅延実行最適化機能も備えています。唯一の欠点は、利用可能な数学的方法の量が限られていることです。最初に完全な説明を調べて、必要なものがすべてあることを確認してください。

関連する問題