[英]Pointer to a C++ class member function as a global function's parameter?
我在調用全局函數時遇到了問題,該函數將指向函數的指針作為參數。 這是全局函數的聲明:
int lmdif ( minpack_func_mn fcn, void *p, int m, int n, double *x,
double *fvec, double ftol)
“ minpack_func_mn”符號是指向函數的指針的typedef,定義為:
typedef int (*minpack_func_mn)(void *p, int m, int n, const double *x,
double *fvec, int iflag );
我想使用指向我創建的類的成員的函數的指針來調用“ lmdif”函數,這是該類函數的聲明:
int LT_Calibrator::fcn(void *p, int m, int n, const double *x,
double *fvec,int iflag)
我正在調用這樣的全局函數:
info=lmdif(<_Calibrator::fcn, 0, m, n, x, fvec, ftol)
不幸的是,我收到一個編譯器錯誤,該錯誤是:“錯誤C2664:'lmdif':無法從'int(__thiscall LT_Calibrator :: *)轉換參數1(void *,int,int,const double *,double *,int) '至'minpack_func_mn'1>沒有可以進行此轉換的上下文”
有什么辦法可以解決這個問題?
在我看來,lmdif函數將“ void * p”作為用戶參數,它只是傳遞給了回調函數(minpack_func_mn fcn)。
如果是這種情況,只需將LT_Calibrator :: fcn設為靜態函數,然后將您的對象作為“ p”參數傳遞即可。 然后,您可以根據需要強制轉換用戶參數(p)以取回對象。
class LT_Calibrator
{
public:
static int fcn(void *p, int m, int n, const double *x, double *fvec,int iflag)
{
LT_Calibrator* pCalibrator = static_cast<LT_Calibrator*>( p );
}
};
然后像這樣調用:
LT_Calibrator someCalibrator;
info=lmdif(<_Calibrator::fcn, &someCalibrator, m, n, x, fvec, ftol);
本質上,成員函數( this
指針)有一個隱式參數,這使這個問題變得棘手。 請查看此FAQ條目以獲取更多信息。
您需要一個非成員或靜態成員函數; 成員函數指針不能代替您的函數類型,因為它需要實例才能對其進行調用。
如果您的函數不需要訪問LT_Calibrator
實例,則可以簡單地將其聲明為靜態,或使其成為自由函數。 否則,您似乎可以使用第一個參數( void *p
)將實例指針傳遞到“蹦床”函數中,然后該函數可以調用成員函數。 與此類似:
// member function
int LT_Calibrator::fcn(int m, ...);
// static (or non-member) trampoline
static int fcn_trampoline(void *p, int m, ...)
{
return static_cast<LT_Calibrator*>(p)->fcn(m,...);
}
info = lmdif(&fcn_trampoline, this, m, ...);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.