문제

OPERATOR ()를 과부하시키는 추상 FUNCTOR 클래스가 있으며이를 구현하는 파생 된 객체가 있습니다.

이 functor 클래스의 배열을 가져 오려고하는 함수 (다른 클래스의 일부)가 있으며 멤

편집 : 나는 그것을 다시 청소하고 명확성을 위해 오래된 작은 예제를 넣었습니다.

class A{
  operator()(x param)=0;
  operator()(y param)=0;
}

class B: public A{
  operator()(x param); //implemented
  operator()(y param);
}
...// and other derived classes from A

void ClassXYZ::function(A** aArr, size_t aSize)
{
  ...//some code here

  for(size_t i = 0; i< aSize; i++){

    A* x = aArr[i];
    for(v.begin(), v.end(), ...//need to pass pointer/functor to right operator() of x here

..//other code
}

몇 가지 방법을 시도했는데 작동하는 방법을 알 수 없습니다. 다른 파생 유형을 가질 수 있으므로 추상 유형을 사용해야하지만 모두 동일한 연산자 ()를 구현해야합니다 (param x. ) 기능.

멤버 기능 연산자 () (param x)를 호출하려면 for_each () 함수 만 있으면됩니다. 구체적인 구현이있는 기능이 다른 기능을 가지고 있으며 단순히 인스턴스를 전달하며 작동합니다. 나는 여기서 비슷한 효과를 얻으려고 노력하고 있지만 어떤 구체적인 수업에 대한 지식이 없는지는 없습니다.

내가 뭘 잘못하고 있죠?

도움이 되었습니까?

해결책

내가 원하는 일을 이해한다면 코드 스 니펫에 오류가 상당히 많이 있습니다.

  • sizeof aArr 잘못된 것입니다. 크기를 명시 적으로 전달해야합니다 (Chrisw가 주목 함).
  • 잃어버린 virtual 원래 선언에 대한 지정자 operator()()
  • 당신의 위치는 확실하지 않습니다 for 루프는 일치하지 않으므로 끝납니다 } (나는 그것이 전혀 없어야한다고 생각합니다)

다음은 다양한 배열을 통해 루프 할 코드입니다. A (또는 A-파생) 물체와 전화 operator() 각각에 따라, 통과 된 인수를 가로 질러 param 매개 변수 :

#include <iostream>
#include <algorithm>
#include <functional>

using namespace std;

typedef double param;      // Just for concreteness

class A {
public:
    virtual void operator()(param x) = 0;
};

class B : public A {
public:
    void operator()(param x) { cerr << "This is a B!  x==" << x << ".\n"; }
};

void function(A** aArr, size_t n, param theParam) {
    void (A::*sFunc)(param x) = &A::operator();
    for_each(aArr, aArr + n, bind2nd(mem_fun(sFunc), theParam));
}

int main(int argc, char** argv) {
    A* arr[] = { new B(), new B(), new B() };

    function(arr, 3, 42.69);

    delete arr[0];
    delete arr[1];
    delete arr[2];
    return 0;
}

mem_fun() 1 파라미터 멤버 기능 포인터를 2 파라미터 함수 객체로 변환해야합니다. bind2nd() 그런 다음 제공되는 인수를 수정하는 1 파라미터 기능 객체에서 생성됩니다. function() 두 번째 논쟁으로. (for_each() 1 파라미터 기능 포인터 또는 기능 객체가 필요합니다.)

편집하다: 기반 Alex Tingle의 대답, 나는 당신이 원했을 것이라고 추론합니다 function() 싱글로 많은 일을하는 것 A-유래 한 물체. 이 경우 다음과 같은 것을 원할 것입니다.

void function(A** aArr, size_t n, vector<param> const& params) {
    for (size_t i = 0; i < n; ++i) {
        void (A::*sFunc)(param x) = &A::operator();
        for_each(params.begin(), params.end(), bind1st(mem_fun(sFunc), aArr[i]));
    }
}

다른 팁

당신은 이런 것을 원합니다 ...

std::for_each(
  it->second.begin(),
  it->second.end(),
  std::bind1st(std::mem_fun(&A::operator()),x)
);

"bar.*fn"표현은 규칙적이거나 비회원 기능 포인터로 평가되지 않습니다. 따라서 그러한 함수를 얻으려면 바인딩 함수 (std :: tr1 :: bind 또는 boost :: bind)를 호출해야합니다.

현재 형식을 사용하여 작동 할 수 없었습니다. 기본 멤버 기능에 대한 포인터를 사용하고 파생 된 클래스 구현을 호출하려고하는 것이 마음에 들지 않는다고 생각합니다.

대신, 나는 구현 될 때 각 파생 클래스에 대한 functors를 반환 할 기본 클래스에 순수한 가상 함수를 포함하도록 코드를 수정했습니다. 나는 다른 일을 생각할 수 없다. 그러나 이렇게 컴파일합니다.

그러나 기본 클래스에서 Pure Virtual "Create Functor"메소드를 사용하지 않고 원래 문제에 대한 해결책이 있으면 궁금합니다.

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