2016-04-05 43 views
0

申し訳ありませんが、私は完全なnoob質問を持っています。自分自身でそれを理解しようとしてきたが、私はちょうどGoogleの関連情報を見つけることができないようだ。関数クラスの乗算(加算、...)演算子のオーバーロード

私は、コードのこの部分を持っている、のはそのようにそれを置くましょう:

class function 
{ 
public: 
    double (*f)(double x); 
    function(double f(double x)): f(f){} 
    double evalf(double x){ 
     return this->f(x); 
    }; 
    function operator*(const function& other) const { 
     return function(this->f*other.f); 
    }; 
}; 

問題は* -overloadが動作しないということで、問題は彼が掛けする方法を見つけ出すことができないということです2つのfの。わかりましたので、ここで私がやったことです:私は、私は自分自身を考え出し

auto linear = [](double x){return x;}; 

auto blub = function(linear); 

例えば、ラムダ式を使用してコンストラクタを呼び出すだとprolly

return function(this->f*other.f); 

はしません私が試したように仕事があった

auto mul = [&](double x){return this->f(x) * other.f(x);}; 
return function(mul); 

でもこれはうまくいかない。 面白いことは、ファンクションクラスの外で動作するようです。

auto mul = [](double x){return linear*linear;}; 

は問題ありません。

誰にでも解決策がありますか?前もって感謝します。

答えて

0

あなたが自分自身に気付いたように、ラムダを使う必要がありますが、ラムダとcaputureを関数ポインタに変換することはできません。だから、あなたが仕事にここに

auto mul = [&](double x){return this->f(x) * other.f(x);}; 
return function(mul); 

をやったために、あなたはあなたが見る、

その後、作品
class function 
{ 
public: 
    std::function<double(double)> f; 

    function(std::function<double(double)> f): f(f){} 
    double evalf(double x){ 
     return f(x); 
    }; 
    function operator*(const function& other) const { 
     return function([=](double x){ return this->f(x) * other.f(x); }); 
    }; 
}; 

で終わる一緒f

std::function<double(double)> f 

にを変更する必要があります Live on coliru

関連する問題