3

この質問に続いて

クラスメンバー関数をサードパーティライブラリのメソッドに渡す方法は?

簡単に要約すると、関数へのポインターを、サードパーティ ライブラリの moveset というクラスのコンストラクターに、次の定義で渡す必要があります。

template <class Space>
moveset<Space>::moveset(particle<Space> (*pfInit)(rng*),
          void (*pfNewMoves)(long, particle<Space> &,rng*),
          int (*pfNewMCMC)(long,particle<Space> &,rng*))

ライブラリで提供される例は、pfInit などのグローバル関数を単純に定義するもので、それらを f、g、および h と呼びます。次に、コントローラ クラス内から smc::moveset Moveset(f,g,h) を呼び出します。

boost:bind を使用して提案を実装しようとしました。残念ながら、私はこれを機能させるのに苦労しています。

class IK_PFWrapper
{
 public:

 IK_PFWrapper(Skeleton* skeleton, PFSettings* pfSettings) ;
 smc::particle<cv_state> fInitialise(smc::rng *pRng);

... 
} ;

コントローラークラスで

IK_PFWrapper testWrapper (skeleton_,pfSettings_);
boost::function<smc::particle<cv_state> (smc::rng *)>  f = boost::bind(&IK_PFWrapper::fInitialise, &testWrapper,_1) ; 

// the 2nd and 3rd argument will be eventually be defined in the same manner as the 1st
smc::moveset<cv_state> Moveset(f, NULL, NULL); 

結果のコンパイラエラーは、

Algorithms\IK_PFController.cpp(88): error C2664: 'smc::moveset<Space>::moveset(smc::particle<Space> (__cdecl *)(smc::rng *),void (__cdecl *)(long,smc::particle<Space> &,smc::rng *),int (__cdecl *)(long,smc::particle<Space> &,smc::rng *))' : cannot convert parameter 1 from 'boost::function<Signature>' to 'smc::particle<Space> (__cdecl *)(smc::rng *)'
with
[
 Space=cv_state
]
and
[
 Signature=smc::particle<cv_state> (smc::rng *)
]
and
[
 Space=cv_state
]
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

どんな助けでも大歓迎です

4

1 に答える 1

0

boost::function を単純な関数ポインタに降格するを参照してください。

boost::function(で作成したboost::bindものは、単純な古い関数ポインターに自動的に変換されません。

を使用するラッパー インターフェイスを作成することをお勧めしますboost::function。つまり、例 (1 つのパラメーターに縮小) は次のようになります。

template <class Space>
moveset<Space>::moveset(boost::function<particle<Space> (rng*)> pfInit)
{
    library_namespace::moveset<Space>(
        pfInit.target<particle<Space>(rng*)>()    // parameter 1
    );
}

ラッパーを作成すると、生の関数ポインターを 1 か所で処理するだけで済みます。お役に立てば幸いです。コード スニペットのすべてのエラーについてお詫び申し上げます。

于 2012-04-11T21:58:34.863 に答える