[英]Passing a member function pointer to a non-member function within another member function
我有一個類似於下面最小示例的代碼,其中 function g
由庫提供,並期望double (*)(double)
作為參數。 我無法改變這一點。 示例代碼無法編譯,因為該成員具有簽名double (*C::)(double)
,如本文中所述,有多種可能的解決方案。
#include <iostream>
double g(double (*f)(double x)) { return f(0); };
class C
{
public:
C(double b) { a = b; };
double f2() { return g(&f1); };
private:
double a;
double f1(double x) { return x + a; };
};
int main()
{
C c (1);
std::cout << c.f2() << std::endl;
return 0;
}
我想知道實現這一點的最佳方法是什么,因為我不想指向C::f1
在 class 之外但在另一個成員 function 內。 As far as I understand, the member function C::f1
is not static since it is only fully known after an instance of the class is initialised. 由於速度也是一個問題:對於其他地方針對此問題的類似版本提出的任何可能的解決方案,這是否會成為問題?
使您的f1
function static
:
static double f1(double x) { return x + a; };
這使它與您的g
function 期望的簽名相同。 由於static
function 沒有隱藏的this
指針,因此您必須找到其他方法來獲取a
的值。
好的,根據前面提到的帖子的評論和想法,我建議將g
更改如下並添加一個包裝器 function f2_wrapper
。
#include <iostream>
double g(double (*f)(double x, void *context), void *context)
{
return f(0, context);
};
class C
{
public:
C(double b) { a = b; };
double f1(double x) { return x + a; };
double f2();
private:
double a;
};
double f2_wrapper(double x, void* context)
{
C *c = (C*) context;
return c->f1(x);
}
double C::f2() { return g(&f2_wrapper, this); }
int main()
{
C c (1);
std::cout << c.f2() << std::endl;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.