2016-08-20 15 views
3

C++にはまったく新しいものです。C++パラメータとしての関数へのポインタを持つ外部関数。メンバ関数を持つクラスの内部で使用されます。

class A 
{ 
private: 
    double m_x, m_y; 
public: 
    A(double x, double y): m_x {x} 
    { 
     m_y = extF(m_x, y, *intF); 
    } 

    double intF(double x) { return 2*x; } 
}; 

そして、それは外部のグローバル関数の使用、他の場所で定義されます::

double extF(double x, double y, std::function<double(double)> f) 
{ 
    if (x*y < 0) 
     return f(x); 
    else 
     return f(y); 
} 

式が偽のですが、私はクラスがあるとします。これはコンパイルされません。私は簡単なintFA::*intF&A::intF、さらにいくつかの非正統的な組み合わせを試みましたが、それはちょうど推測です。問題は、クラスAがグローバルな外部関数を使用する唯一のものではなく、実行時にユーザーが選択できるはずのものです。検索では、インスタンス化(?)が必要なため、このようなメンバ関数へのポインタを作ることはできないと答えた回答がありましたが、解決策は見つかりませんでした。これはできますか?はいの場合、どうですか?


編集:追加の質問:メンバ関数がconst double f(...) constであればどのメンバ関数へのポインタを行うことができますか?

+0

クラスのメンバーにアクセスしない場合は、 'intF'静的メンバー関数を作成してください。 – songyuanyao

+0

@songyuanyao残念ながら、そうです。これが問題であることが分かっていれば、コードを修正して表示するでしょう。 –

+0

@aconcernedcitizenあなたのせいではなく、私のこと。私はOTに最初に行きました、これらのコメントを削除することができます。 –

答えて

3

一つの変異体は、単にラムダを使用することです:

class A 
{ 
private: 
    double m_x, m_y; 
public: 
    A(double x, double y): m_x {x} 
    { 
     m_y = extF(m_x, y, [&](double d){ return intF(d);}); 
    } 

    double intF(double x) { return 2*x; } 
}; 

他の変形は、ラムダとstd::mem_fn(自分のクラスの残りの部分のコードを省略)を使用することです:

A(double x, double y): m_x {x} 
{ 
    auto fn = std::mem_fn(&A::intF); 
    m_y = extF(m_x, y, [&](double d) {return fn(this, d);}); 
} 

そして、最後にあなたがlambdaを取り除くかもしれない場合bindメンバ関数ポインタのオブジェクトパラメータ:

A(double x, double y): m_x {x} 
{ 
    auto fn1 = std::bind(std::mem_fn(&A::intF), this, std::placeholders::_1); 
    m_y = extF(m_x, y, fn1); 
} 

これらはすべて定数メンバ関数でも動作します。

+0

お返事ありがとうございます(@songuyanyaoとあなた)。私は 'std :: mem_fn'と' std :: bind'についてはまだ分かりません。私は今それらについて読むでしょう。 –

2

std::bindを使用してメンバー関数をバインドできます。

またはlambdaを使用してください。

A(double x, double y): m_x {x} 
{ 
    m_y = extF(m_x, y, [this](double d) { return intF(d); }); 
} 

BTW:constメンバー関数でもうまくいきますが、ここでは関係ありません。

LIVE

関連する問題