2012-10-05 7 views
1

개체의 멤버 변수를 설정할 수있는 boost :: 함수를 만들려고합니다. 나는 내가하려고하는 (그리고 실패한) 것에 대해 생각할 수있는 가장 간단한 예를 만들었다. 나는 boost :: bind에 대한 이해를 가지고있는 것처럼 느껴지지만, 나는 새로운 것을 향상시키고 boost :: function을 잘못 사용하고 있다고 생각한다.boost :: function 및 boost :: bind를 멤버 변수에 사용

#include <iostream> 
#include <Boost/bind.hpp> 
#include <boost/function.hpp> 

class Foo 
{ 
public: 
    Foo() : value(0) {} 

    boost::function<void (int&)> getFcn() 
    { 
     return boost::function<void (int&)>(boost::bind<void>(Foo::value, this, _1)); 
    } 

    int getValue() const { return value; } 

private: 
    int value; 
}; 

int main(int argc, const char * argv[]) 
{ 
    Foo foo; 

    std::cout << "Value before: " << foo.getValue(); 

    boost::function<void (int&)> setter = foo.getFcn(); 
    setter(10);  // ERROR: No matching function for call to object of type 'boost::function<void (int &)>' 
        // and in bind.hpp: Called object type 'int' is not a function or function pointer 

    std::cout << "Value after: " << foo.getValue(); 

    return 0; 
} 
내가 그냥 잘못이 모든 일에 대해 갈 (10) 오전 푸 :: 값을 설정 기능을 사용하려면 라인 (28)에 오류, 데

? 이 모든 것을 위해 boost를 사용하는 대신 int * 나 something을 그냥 돌려 주어야합니까? 왜냐하면 내가 'getFcn()'을 호출하는 이유는 실제 프로젝트에서 메시징 시스템을 사용하고 있고 원하는 데이터가있는 객체가 더 이상 존재하지 않기 때문에 getFcn은 빈 부스트 :: 함수를 반환하기 때문입니다. 하지만 int로 추측 * 아무것도 찾을 수 없으면 NULL을 반환 할 수 있습니다.

답변

2

코드에서이 boost::bind<void>(Foo::value, this, _1)은 기본적으로 구성원 기능으로 Foo::value을 사용하고 있습니다. 어떤 잘못입니다. Foo::value은 기능이 아닙니다.

class Foo 
{ 
    ... 
    boost::function< void (Foo*, int) > getFcn() 
    { 
     return boost::function< void (Foo*, int) >(&Foo::setValue); 
    } 

    void setValue (int v) 
    { 
     value = v; 
    } 
    ... 
} 

int main() 
{ 
    ... 
    boost::function< void (Foo*, int) > setter = foo.getFcn(); 
    setter(&foo, 10); 
    ... 
} 

그래서 여기에 함수가 명시 적으로 this 객체를 취합니다

단계로이 단계를 구축 할 수 있습니다. boost.bind을 사용하여 첫 번째 매개 변수로 this을 바인딩합니다.

class Foo 
{ 
    ... 
    boost::function< void (int) > getFcn() 
    { 
     return boost::bind(&Foo::setValue, this, _1); 
    } 

    void setValue (int v) 
    { 
     value = v; 
    } 
    ... 
} 

int main() 
{ 
    ... 
    boost::function< void (int) > setter = foo.getFcn(); 
    setter(10); 
    ... 
} 

(테스트되지 않은 코드)

+0

나는이 작업을 수행 할 모든 변수에 대한 클래스의 setter 메소드를 피하기 위해 노력하고있어. 변수를 직접 변경하는 방법을 찾고 있습니다. boost :: function을 그렇게 사용하지 않을 수 있습니까? –

+1

@ 닉 포스터, 나는 믿지 않는다. Boost.Function은 함수처럼 작동하는 것들에 대한 래퍼입니다. 당신은 그것을'int'로 감싸려고합니다. – Vikas

+0

충분히 좋았을 텐데, bind를 사용하여 멤버 변수에 바인드 할 수 있었기 때문에'member'를 사용하여 멤버 변수를 설정할 수 있다고 가정했습니다. –