C ++ 멤버 기능 포인터 및 STL 알고리즘
-
12-09-2019 - |
문제
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"메소드를 사용하지 않고 원래 문제에 대한 해결책이 있으면 궁금합니다.