簡體   English   中英

指向函數成員的指針

[英]pointer to function member

我正在嘗試使用指向函數成員的指針,我無法弄清楚它是如何工作的。

我有一個看起來像這樣的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的一個成員。

有點喜歡這個:

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)

我不能使用static / const成員,因為在我的最終實現中,A將指向A對象集合中的特定A,其中的對象看起來像這樣

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

做到這一點失敗了

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

編譯器告訴我使用&A :: Minus,但這對我不起作用。

我甚至可以這樣做嗎?

干杯

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

不幸的是,該語言不允許您使用該語法將對象綁定到成員函數以生成可調用對象。 您可以傳入對象引用(或指針)並在調用函數時綁定它:

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中的新增function ; 如果您遇到舊版本的語言,Boost會提供等價物。

使用宏。

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

調用您的成員函數很簡單,因為您已經有一個要調用的函數的typedef

float result = CALL_MEMBER_FN(*myA, pA)(a, b);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM