2017-04-02 59 views
0

これは複数回尋ねられていることを知っていますが、ほとんどの回答はわかりにくいです。 私は何が間違っているのか理解するのを助けてくれますか?C++ std :: functionを使用したメンバ関数へのポインタ

#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <iterator> 
#include <functional> 

class A{ 
    public: 
     A(double i){ 
      _b = i; 
     } 
     double square(double i){ 

      return i*i*_b; 
     } 


    private: 
    double _i; 
    double _b; 
}; 

double cube(double (*objfunc)(double), double x){ 
    return objfunc(x)*x; 
} 

int main() 
{ 
    double v = 2.0; 
    A a(v); 

    using std::placeholders::_1; 
    std::function<double(double)> f_square = std::bind(&A::square, &a, _1); 
    double x = cube(f_square,3.0); 
    std::cout << " x = " << x << std::endl; 


} 

ありがとうございます。

クラスAとキューブ関数をそのまま使用すると、どのようにしてメイン関数でキューブ関数を使用できますか?

アップデート:修正することになり、これを行うための唯一の方法:

double cube(std::function<double(double)> objfunc, double x){ 
    return objfunc(x)*x; 
} 
+0

プレーン関数ポインタが必要な場所で 'std :: function'インスタンスを渡そうとしています。前者は後者に転換できません。 –

+0

主な機能を変更するのを手伝ってください。関数の正方形を使用する適切な方法は何ですか? – user1453817

+0

メンバー関数ポインタは単純なポインタではないので、できないと思います。しかし、私は理解が非常に限られています。専門家が入るのを待つようにしましょう。 – user1453817

答えて

2

cubeを作るには、std::functionオブジェクトの代わりに、関数ポインタを取ります。また、std::bindを取り除き、ラムダと一緒にautoの魔法を使用してください。

#include <iostream> 
#include <functional> 

class A 
{ 
public: 
    A(double i) : _b(i) {} 
    double square(double i) { return i*i*_b; } 
private: 
    double _b; 
}; 

double cube(std::function<double(double)> objfunc, double x) 
{ 
    return objfunc(x)*x; 
} 

int main() 
{ 
    double v = 2.0; 
    A a(v); 

    auto f_square = [&a] (double x) { return a.square(x); }; 
    double x = cube(f_square,3.0); 
    std::cout << " x = " << x << std::endl; 
} 
関連する問題