簡體   English   中英

指向C ++類成員函數作為全局函數參數的指針?

[英]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(&LT_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(&LT_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.

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