2009-05-05 2 views
0

나는 펑터를 작업 단위로 사용하는 클래스가 있습니다. Run() 메소드에서 펑터에 대한 참조를 허용합니다.파생 함수와 반환 유형 및 매개 변수가 모두

이 작동
class baseFunctor{ 

public: 
    virtual void operator()()=0; 
    virtual baseFunctor Clone()=0; 
}; 

그러나 분명히 무효 반환하는 연산자 방법을 가지고 이러한 펑터를 제한하고이 클래스는 어떤 펑에서 작동 할 수 있도록하려면, 모든 펑은 다음과 같습니다 내 기본 펑터 클래스에서 파생되어야합니다 매개 변수를 허용하지 않습니다. 어떤 종류의 매개 변수를 취하고 아무 것도 반환 할 수있는 클래스의 함수 작성자를 받아 들일 수 있어야합니다. 그것의 명백하게 할 수있는 그러나 나는 그것을하는 방법을 찾아내는 것을 보일 수 없다. 템플릿, 다중 상속을 사용하는 방법을 고려해 봤지만이 펑터를 실행해야하는 클래스가 모든 유형을 허용 할 수 있어야하므로 기본 클래스 유형을 사용하므로 실제 유형을 알 수 없으므로 계속 방해 받고 있습니다. 펑터의

어떤 길을보아야하는지에 대한 의견을 보내 주시면 감사하겠습니다.

답변

2

어떻게 할 펑터가 제공하고있는 경우, 반환 값을 어떻게 무엇을 매개 변수 알고 호출 클래스?

0

왜 펑터를 반환하겠습니까? 너 어떤 상태도 저장하고 있니? 정확히 당신이하고 싶은 것이 무엇인지는 분명하지 않기 때문에 좀 더 자세히 설명해 드리겠습니다.

상속을 사용하려는 경우 공변 반환 유형 (및 Virtual Constructor idiom)을 조회하십시오.

이제 문제의 고기에 대해 : 문제는 실제로 펑터를 통과하는 것이 아니라 펑터 응용 프로그램을 사용하는 것입니다. boost::lambdaboost::parameter을 살펴볼 수도 있습니다.

0

저는 C++의 varargs와 같은 줄임표 인수가 필요하다고 생각합니다.

1

부스트 라이브러리 (www.boost.org)를 사용하고 계시다면 Boot.Bind 및 Boost.Function과 같은 흥미로운 기능을 찾을 수 있습니다. 나는 당신이 토론하고있는 것을 따라 뭔가를 성취하기 위해 과거에 그들을 사용 해왔다.

Boost.Bind를 사용하는 경우 Functor가 예상하는 인수 수와 Run 메서드가 예상하는 인수의 수 (예 : 0) 사이의 차이점을 설명하기 위해 Functor를 커링 할 수 있습니다. Functor를 생성하는 코드는 모든 인수를 특정 값에 바인딩해야하므로 Run()에 전달할 수있는 인수가 0 인 함수를 만듭니다.

MV

0

아마도 std :: tr1 :: function이 재미있는가요?

1

이 권리를 읽는다면 "방문자 패턴"이 있습니다. 찾아 보는 것이 좋은 일일 수도 있습니다.

누군가 누군가가 functor가 인수를 제공하는 유형을 알아야합니다. 펑터 (functor)를 사용하면 인수는 파생 클래스의 필드에 할당되고 operator()는 해당 필드에서 작동합니다. 즉, functor를 호출하고 그것에 대해 아무 것도 모르는 바보 같은 메서드는 지식이 많은 사람이 클로저 (메서드와 인수를 모두 한 클래스에 포함)를 제공합니다.

연산자()에서 여러 인수를 사용하는 일반 펑터를 원한다면 템플릿을 사용하면 그곳으로 이동하게되지만, 하나당 하나씩 필요합니다.

+0

좋습니다. 클래스를 생성하고 그것을 펑터에게 전달하는 메인 클래스는 펑터가 어떤 타입인지, 펑터가 아닌 펑터를받는 클래스를 알고, 단지 operator() 메소드를 호출한다. 정보에 감사 드리며 방문자 패턴을 살펴 보겠습니다. –

1

나는 Neil에 동의합니다.주요 클래스는 전달할 매개 변수와 이러한 펑터에서 기대할 반환 값을 알아야합니다. "인자"를 필요한 인자와 반환 값을 가진 함수를 지원하는 적절한 클래스로 타입 캐스트 할 수 있습니까?

class baseFunctor 
{ 
}; 

class functor1x2: public baseFunctor 
{ 
public: 
    virtual void* execute(void*, void*); 

} 

class MainClass 
{ 
public: 
    void Execute(baseFunctor* ipFunctor) 
    { 
     functor1x2* lpFunctor1x2 = dynamic_cast<functor1x2*>(ipFunctor); 
     if(lpFunctor1x2) 
     { 
     lpFunctor1x2->execute(NULL, NULL); 
     } 
    } 
} 

나는 드류가 언급 한 바와 같이 더 쉽게, 방문자 패턴을 달성 할 수없는이 방법으로 수행 할 수 있는지 확실하지 않다.