以下是我想在第三方庫中使用的類的構造函數(因此更改此函數不是一種選擇)。如何將類成員函數傳遞給第三方庫中的方法?
template <class Space>
moveset<Space>::moveset(particle<Space> (*pfInit)(rng*),
void (*pfNewMoves)(long, particle<Space> &,rng*),
int (*pfNewMCMC)(long,particle<Space> &,rng*))
然而,而不是簡單地定義3個全局函數,我需要每個函數知道各種額外的信息,這顯然是沒有輸入參數,我們無法通過。爲了使問題進一步複雜化,我將要創建這個moveset對象的幾個不同實例,每個實例都想使用相同的函數,但是需要使用不同的基礎數據。
我的想法是創建一個控股類的東西沿着這些線路,
Class DataPlusFunctions {
public:
DataPlusFunctions(Data* dataPtr) { dataPtr_ = dataPtr ;}
smc::particle<cv_state> fInitialise(smc::rng *pRng)
{
// the actual function will be a lot more complicated than this and
// likely to require calling other methods/classes.
// The Data stored in a different class will be changing...which is
// important in relation to the pfNewMoves function.
double value = dataPtr_->value() ;
return smc::particle<cv_state>(value,likelihood(0,value));
}
... same for other required functions
private:
Data* dataPtr_ ;
}
*
Class MainClass {
...
void IK_PFController::initialise()
{
std::vector<DataPlusFunctions> dpfV ;
for (int i = 0 ; i < NSAMPLERS ; i++)
dpfV.push_back(DataPlusFunctions(&data[i])) ;
pSamplers_ = (smc::sampler<cv_state>**)(new void* [NSAMPLERS]) ;
for (int i = 0 ; i < NSAMPLERS ; i++) {
// Normal way of calling function, having defined global functions e.g.
//smc::moveset<cv_state> Moveset(fInitialise, fMove, NULL);
// How to achieve this given my problem ??????????????
//smc::moveset<cv_state> Moveset(&dpfV[i]::fInitialise, &dpfV[i]::fMove, NULL);
pSamplers_[i].SetMoveSet(Moveset);
}
}
}
是否被允許?如果沒有,是否有可能實現我所嘗試的,因爲我將能夠改變運動類課程?
看看'boost :: bind'。 – Chad 2012-04-03 16:26:04
請問您是否可以提供更多信息,具體說明它將如何幫助我解決所描述的問題。 – oracle3001 2012-04-03 19:46:49
請參閱下面的答案 – Chad 2012-04-03 21:08:57