2009-09-08 5 views
0

나는 다음과 같은 코드가 있다고 가정하십시오 SomeFunc() 함수에서boost :: bind 접근 자?

int f(int, int); 

int main() 
{ 
    SomeFunc(boost::bind(f, 1, 2)); 
} 

를, 그것은 바운드 형에 의해 개최되는 인수에 액세스 할 수 있습니까? 이 같은 것 (의사 코드) :

// Obvious syntax issues... 
void SomeFunc(boost::bind& functor) 
{ 
    if(functor.function == &f) 
    { 
     if(functor.argument1 == 1) 
      DoSomething(); 
    } 
} 

부스트 :: 바인드 유형에서이 정보를 가져올 수 있습니까?

+0

이 질문에 대한 답변이 있지만 문제를 설명하려고하면 실제 문제를 해결할 수 있습니다. – sbk

+0

http://stackoverflow.com/questions/1395312/access-boostfunction-arugments의 중복 –

답변

2

진짜 질문은 왜 그렇게하고 싶습니까?
나는 당신이 시도하고있는 사실이 조금 걱정 스럽다는 점을 의심합니다.

0

아니요, boost::bind으로는 그럴 수 없습니다.

boost::bind은 모든 세부 정보가 숨겨진 일종의 Functor 개체를 생성합니다. 당신은 boost::function 또는 boost::signal을 생성하고 수행 할 수있는 유일한 것 : 실행하십시오. boost::function 개체를 비교할 수도 없습니다.

어쨌든, 당신이 해결하려는 문제가 확실하지 않습니다. 그런 접근 방식은 나에게 어색해 보인다. 정말이 필요하십니까?

5

boost :: bind는 형식이 아닌 템플릿 기능입니다. 이 함수에 의해 반환 된 실제 타입은 의 어떤 종류의 functor 인 타입입니다. 실제로 boost :: bind 함수에 대한 인수가 무엇인지에 따라 많은 다른 형식을 반환합니다.

유형이 지정되지 않았으며 라이브러리는 CopyConstructible 상태이므로 operator()에 적절한 수와 유형의 인수 (각 자리 표시 자, 바인딩 된 메소드/함수에서 추론 한 유형)를 제공하고 제공합니다 내부 유형 result_type은 해당 연산자()의 반환 유형과 같습니다.

지정되지 않은 클래스의 인터페이스는 잘 지정되지 않았습니다. 아마도 인수에 대한 접근자를 제공하지 않을 것이고, 내부의 지식을 라이브러리의 내부에서 습득하게된다고하더라도 라이브러리를 업그레이드하면 코드가 손상 될 위험이 있습니다 (구현자는 유형 및 유형을 자유롭게 변경할 수 있습니다). 공개적으로 문서화되지 않은 모든 인터페이스).

전체 라이브러리는 인수가 무엇인지에 대해 실제로 신경 쓰지 않거나 인수가 정의되어 있거나 자리 표시 자만 사용되는 경우에도 결과 객체가 주어진 인터페이스로 호출 할 수 있는지 신경 써야합니다 .

아니, 그렇게 할 수 없습니다.

관련 문제