というか、static関数で無いと渡せないのは呼び出した時に
必ずその関数が使える保障がいるからですよね。
で、メンバー関数はメンバー変数を使えるので
もしインスタンスが消滅した後で呼んでしまったら破綻します。
だから、メンバー変数の参照が行えないstaticにする必要があるわけです。
呼び出したい関数がメンバー変数を参照しない関数なら
staticにした所で不都合は無いでしょうし、
コールバックに使いたいならそうするべきです。
なので、メンバー関数をstatic関数しか渡せない所に引き渡そうという発想自体に
問題があると思いますよ。
渡せない理由を考えれば、答えは明白ですからね。
ソースの変更を最小限にするなら
boost::bind boost::function
を使う手もある。
#include <iostream>
#include <tchar.h>
#include <boost/bind.hpp>
#include <boost/function.hpp>
typedef void (*Callback)( int n );
typedef boost::function<void (int)> Callbackfunc;
void Function( Callback cb )
{
cb( 100 );
}
void Function( Callbackfunc cb )
{
cb( 100 );
}
// 普通の関数
void func1(int n)
{
std::cout << n << std::endl;
}
// メンバ関数
class bindtest
{
public:
bindtest(int hoge)
: hoge_(hoge)
{};
~bindtest(){};
void func2(int n){
std::cout << n << std::endl;
std::cout << member hoge : << hoge_ << std::endl;
};
private:
int hoge_;
};
int _tmain(int argc, _TCHAR* argv[])
{
// まずは、普通の関数の場合
Function(&func1);
// メンバ関数の場合
bindtest memberfunc(230);
boost::function<void (int)> f;
f = boost::bind(&bindtest::func2, memberfunc, _1);
Function(f);
return 0;
}
お試しを
PATIOさんのコメントがすべてだと思うのですが、
結局解決されたんでしょうか?
> [[解決]]
> >void Fnc( int n ) と void Hoge::Fnc( int n ) は全然別物なので、
> >typedef を変えないのは無理です。
> Hoge のインスタンスが必要なので、Function を変えないのも無理です。
> 無理ですか・・。それがわかっただけでもよかったです。
> ありがとうございました。
「無理」と言うことで解決させていただきました。
それと、いろいろな代替案、とても参考になりました。
みなさんありがとうございました。