CClass inst;
boost::function<bool(int)> func = boost::bind(&CClass::Foo, &inst, _1);
このような状況で、以下のように「func」からinstのポインタ(&inst)またはアドレスにアクセスしたいと思います。
CClass* pInstance = func.obj_ptr; (This is just a form that I want)
どのようにできるのか?
CClass inst;
boost::function<bool(int)> func = boost::bind(&CClass::Foo, &inst, _1);
このような状況で、以下のように「func」からinstのポインタ(&inst)またはアドレスにアクセスしたいと思います。
CClass* pInstance = func.obj_ptr; (This is just a form that I want)
どのようにできるのか?
それはいけません。の要点は、その中に格納されていた型boost/std::function
を消去することです。あなたが話していることを実装するには、型を再構成する必要があります。C++ は静的に型指定された言語であるため、そのような関数を呼び出すコードは、返される型を明示的に提供する必要があります。のようなものfunc.value<TypeName>()
。
さらに、あなたが話していることは、それが利用可能であったとしても不可能です. function
知っている唯一の型は、それが与えられた型です。からの戻り値ですboost/std::bind
。そのタイプは、実装の詳細を掘り下げることなく広く利用できるわけではありません。
したがって、あなたが求めていることは不可能です。自分で別の場所に保管する必要はありません。
そのようなメンバー (引数) は、boost::function クラス内で公開されるべきではないと思います。私が正しければ、あなたはそれをすることができません。少なくともいくつかの奇妙な操作はありません。
あなたが本当に似たようなものが必要で、func オブジェクトの作成者である場合、私が今想像できる最もクリーンな方法は
std::pair<boost::function<bool(int)>, CClass *> funcAndObj
、 を呼び出しfuncAndObj.first()
てからポインターを取得することfuncAndObj.second
です。
boost::function::target()
テンプレートメソッドを使用する方法があります。ただし、boost::bind
未指定の型を返すため、witchはまだ引数にアクセスする方法を提供していないため、独自のバインダーファンクターを作成する必要があります。次にいくつかの例を示します。
class MyClass
{
public:
void myMethod()
{
std::cout << "This is my Method" << std::endl;
}
};
struct MyFunctor
{
MyFunctor(MyClass* o, void (MyClass::*m)()): object(o),method(m){}
MyClass* object;
void (MyClass::*method)();
void operator() ()
{
return (object->*method)();
}
};
だから今あなたはアクセスすることができます:
MyClass myObject;
boost::function< void() > func= MyFunctor(&myObject, &MyClass::myMethod);
func();
assert( func.target<MyFunctor>()->object == &myObject );
と同じように、テンプレートメソッドboost::any
を多形アクセスする方法はありません。target