2012-05-16 4 views
0
CClass inst; 
boost::function<bool(int)> func = boost::bind(&CClass::Foo, &inst, _1); 

이 경우 다음과 같이 inst의 포인터 (& inst) 또는 "func"의 주소에 액세스하고 싶습니다."boost :: function"에서 클래스 인스턴스 (객체) 포인터에 어떻게 액세스 할 수 있습니까?

CClass* pInstance = func.obj_ptr; (This is just a form that I want) 

어떻게하면됩니까?

+0

어디에서'func'의 내부에 액세스하고 싶습니까? 'func'가 정의 된 동일한 범위 내에서 왔습니까? 아니면'func' 함수의 범위 내에서 왔습니까? – irobot

답변

1

boost::function::target() 템플릿 방법을 사용하는 방법이 있습니다. 그러나 boost::bind이 불특정 유형을 반환하기 때문에 마녀는 인수에 액세스하는 방법을 제공하지 않으므로 바인더 펑터를 직접 작성해야합니다. target 템플릿 방법을 다형성 액세스 마녀를 할 방법이없는 boost::any와 같은

MyClass myObject; 
boost::function< void() > func= MyFunctor(&myObject, &MyClass::myMethod); 
func(); 

assert(func.target<MyFunctor>()->object == &myObject); 

같은 : 그래서 지금 당신이 액세스 할 수

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)(); 
    } 
}; 

: 다음은 몇 가지 예입니다.

2

해당 멤버 (인수)는 boost :: function 클래스 내에서 public이 아니어야합니다. 내가 옳다면, 당신은 그것을 할 수 없을 것입니다. 최소한 이상한 조작은 필요 없습니다.

당신이 정말로 FUNC 객체의 창조자 비슷한 일을 필요로하고 있다면, 지금 내가 상상할 수있는 가장 깨끗한 방법은 다음과 같습니다 std::pair<boost::function<bool(int)>, CClass *> funcAndObj, 다음 funcAndObj.first()를 호출하고 funcAndObj.second에서 포인터를 얻는다.

4

수 없습니다. boost/std::function의 전체 점은 이고, 그 안에 저장된 유형은입니다. 당신이 말하는 것을 구현하려면 유형을 다시 구성해야합니다. C++은 정적으로 타입이 지정된 언어이므로, 그러한 함수를 호출하는 코드는 반환되는 타입을 명시 적으로 제공해야합니다. func.value<TypeName>()과 같은 것입니다.

심지어 모레 토 (moreso)조차도, 그것이 가능하다하더라도 당신이 말하는 것은 가능하지 않을 것입니다. function이 알고있는 유일한 유형은 이 부여 된 유형이며입니다. boost/std::bind의 반환 값은 무엇입니까? 이 유형은 구현 세부 사항을 파고 들지 않고 널리 사용할 수 없습니다.

그래서 당신이 요구하는 것은 불가능합니다. 너 자신 다른 곳에 그것을 저장하지 않고.