문제

unftors를 작업 단위로 사용하는 수업이 있습니다. run () 메소드에서 functor에 대한 참조를 허용합니다. 이 클래스가 모든 functor에서 작동하도록하려면이 모든 unftors는 다음과 같이 보이는 기본 functor 클래스에서 파생되어야합니다.

class baseFunctor{

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

그러나 이것은 작동하지만 분명히 이러한 기능은 무효를 반환하고 매개 변수를 수락하는 연산자 메소드를 갖는 것으로 제한합니다. 수업 시간에 모든 유형의 매개 변수를 가져갈 수있는 기능을 수락하고 무엇이든 반환 할 수 있어야합니다. 분명히 할 수는 있지만 그렇게 할 방법을 찾을 수는 없습니다. 나는 템플릿, 다중 상속을 사용하는 것을 고려했지만이 functor를 실행 해야하는 클래스가 모든 유형을 수락 할 수 있어야하므로 기본 클래스 유형을 수락하므로 실제 유형을 알지 못할 것입니다. FUNCTOR의.

어떤 길을보아야하는지에 대한 제안은 감사 할 것입니다.

도움이 되었습니까?

해결책

functor를 부르는 클래스는 어떤 매개 변수를 제공 할 것인지, 반환 값으로 무엇을 해야하는지 어떻게 알 수 있습니까?

다른 팁

따라서이 권리를 읽고 있다면 "방문자 패턴"이 있습니다. 당신이 찾는 것이 좋은 일일 수 있습니다.

누구 functor가 인수를 제공하는 유형의 유형을 알아야합니다. 종종 기능을 갖춘 인수는 파생 클래스의 필드에 할당되며 Operator ()는 해당 필드에서 작동합니다. 즉, FUNCTOR를 호출하고 그것에 대해 아무것도 알지 못하는 멍청한 방법은 더 지식이 풍부한 사람에 의해 폐쇄 (메소드와 한 클래스의 인수)가 주어집니다.

Operator ()에서 여러 인수를 취하는 일반적인 기능을 원한다면 템플릿을 사용하면 그곳에 갈 수 있지만 아티브 당 하나가 필요합니다.

나는 닐과 동의합니다. 메인 클래스는 전달해야 할 매개 변수와 이러한 기능에서 기대할 수있는 값을 알아야합니다. "functor"를 필요한 인수와 반환 값으로 기능을 지원하는 적절한 클래스에 "functor"를 입력 할 수 있습니까?

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

Drew가 지적했듯이 방문자 패턴으로 더 쉽게 달성 할 수없는이 접근법으로 무엇을 달성 할 수 있는지 잘 모르겠습니다.

Boost Library (www.boost.org)를 사용할 수있는 경우 Boot.bind 및 Boost.function을 찾을 수 있습니다. 나는 과거에 그것들을 사용하여 당신이 논의하는 것의 선을 따라 매우 많은 것을 달성했습니다.

boost.bind를 사용하는 경우 unftors에서 카레를 수행하여 Functor가 기대하는 인수의 차이와 실행 방법이 기대하는 인수 수 (즉, 0)의 차이를 설명 할 수 있습니다. functor를 생성하는 코드는 인수를 특정 값에 바인딩하고 run ()로 전달할 수있는 제로 연관 untctor를 생성해야합니다.

MV

왜 펀치를 반환하고 싶습니까? 상태도 저장하고 있습니까? 정확히 무엇을하고 싶은지 명확하지 않기 때문에 더 자세한 내용은 크게 높이 평가 될 것입니다.

상속을 사용할 계획이라면 Cobariant Return 유형을 찾아보십시오. 가상 생성자 관용구).

이제 문제의 고기의 경우 : 문제는 실제로 기능자를 통과하는 것이 아니라 Functor 응용 프로그램을 사용하는 것입니다. 당신은보고 싶을 수도 있습니다 boost::lambda 그리고 boost::parameter 또한.

C ++에 대한 varargs와 같은 타원 제 인수를 원한다고 생각합니다.

아마도 std :: tr1 :: 기능이 흥미 롭습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top