5

関数メンバーへのポインターを使って何かをしようとしていますが、これがどのように機能するのか理解できません。

私はこのようなクラスAを持っています

class A
{
    public:
    float Plus    (float a, float b) { return a+b; }
    float Minus   (float a, float b) { return a-b; }
    float Multiply(float a, float b) { return a*b; }
    float Divide  (float a, float b) { return a/b; }
};

Aへのポインターを宣言してから、Aのメンバーの1つへの関数ポインターを別の関数に渡したいと思います。

これが好きなもの:

void Will_Get_Function_Pointer(float a, float b, float (A::*pt2Func)(float, float))
{
    (...)
}

私がこのようなものでそれを呼ぶところ

A* myA = new A;
Will_Get_Function_Pointer(1.00,2.00, &myA->Minus)

最終的な実装では、AはAオブジェクトのコレクション内の特定のAを指し、次のようになるため、static/constメンバーを使用できません。

vector<A> vecA;
myA = &vecA[xxx]

これを行うと惨めに失敗します

typedef  float (A::*pA)(float x, float y);
pA p = &myA->Minus;

コンパイラは&A :: Minusを使用するように指示しますが、それは私には機能しません。

私もこれを行うことができますか?

乾杯

4

3 に答える 3

6
A* myA = new A;
Will_Get_Function_Pointer(1.00,2.00, &myA->Minus)

それはいけません。あなたは次のようなものを使うべきです

void Will_Get_Function_Pointer(A* object, float a, float b,
float (A::*pt2Func)(float, float))
{
   (object->*pt2Func)(a, b);
}

そしてそれを

A* myA = new A;
Will_Get_Function_Pointer(myA, 1.00, 2.00, &A::Minus);

簡単な例。

http://liveworkspace.org/code/79939893695e40f1761d81ba834c5d15

于 2012-09-06T16:05:43.037 に答える
2

残念ながら、この言語では、その構文を使用してオブジェクトをメンバー関数にバインドし、呼び出し可能なオブジェクトを作成することはできません。関数を呼び出すときに、オブジェクト参照(またはポインター)を渡してバインドすることができます。

void Will_Get_Function_Pointer(float a, float b, A & obj, float (A::*pt2Func)(float, float))
{
    (obj.pt2Func)(a,b);
}

Will_Get_Function_Pointer(1.00, 2.00, myA, &A::Minus);

または、関数ポインタをオブジェクトにバインドする関数オブジェクトを作成できます。

void Will_Get_Function(float a, float b, std::function<float(float,float)> f)
{
    f(a,b);
}

Will_Get_Function(1.00, 2.00, std::bind(&A::Minus, &myA));

functionbindはC++11の新機能であることに注意してください。古いバージョンの言語で立ち往生している場合、Boostは同等のものを提供します。

于 2012-09-06T16:13:19.077 に答える
2

マクロを使用します。

#define CALL_MEMBER_FN(object,ptrToMember)  ((object).*(ptrToMember))

呼び出したい関数のtypedefがすでにあるため、メンバー関数の呼び出しは簡単です。

float result = CALL_MEMBER_FN(*myA, pA)(a, b);
于 2012-09-06T16:13:27.173 に答える