2017-12-20 9 views
-1

동일한 서명이지만 클래스가 다른 멤버 함수에 함수 배열을 만들려고합니다. (그러나 그들은 유전된다). 이런 식으로 시도한 이유는 무엇이며 어떻게 작동하지 않는지 이해하지만 어떻게 해결할 수 있습니까? 예를 들어 함수가 다른 클래스의 경우 객체에 존재하지 않는다면 (그 클래스가 다른 경우) 신경 쓸 것입니다.기본 클래스의 일반 멤버 함수 배열

class Base 
{ 
public: 
    virtual void BaseFunc(); 
}; 

class X : Base 
{ 
public: 
    void XFunc(); 
}; 

class Y : Base 
{ 
public: 
    void YFunc(); 
}; 
int main() 
{ 
    std::vector<std::function<void(Base*)>> v; 
    v.push_back(&Base::BaseFunc); //OK 
    v.push_back(&X::XFunc); //NOT OK 
    v.push_back(&Y::YFunc); //NOT OK 
} 
나는 또한 그 클래스의 멤버 함수에 대한 포인터가있는 템플릿 클래스를 가진 후 나는 그 클래스에서 부를 것이다,하지만 난 템플릿 인수를 포기하지 않고 템플릿 클래스의 배열을 가질 수 없습니다 시도

(클래스가 단순하고 크기가 템플릿 인수에 의존하지 않더라도). 또한 그냥 배열 void 포인터가 데 노력했다 그러나 void 포인터 포인터가 구성원 함수 포인터를 캐스팅 불가능하다는 것을 알게되었습니다. (가능한 경우 알려주 수 있습니다.)

편집 : 내 의도에 대해 몇 가지 배경을 제공하기 위해 여기에 내 의견을 붙여 넣습니다 : 내 생각은 사용자가 기본 클래스를 상속 한 클래스의 함수를 구현 한 다음 이러한 클래스를 내 클래스에 전달하여 배열에 저장할 수있게하는 것입니다. 지정된 조건에 따라 호출합니다.

편집 2 : 나는 C에있는 솔루션이 필요 ++ (11) 또는 C++ (14)

+3

이 XFunc'과'YFunc' '로서 작동 할 수없는 것은 기지국에 알려져 있지 않다 :

template <typename R, typename X> class open_mem_fun { R (X::*fn)(); public: open_mem_fun(R (X::*fn)()): fn(fn) {} template <typename T> R operator()(T* p) const { return (dynamic_cast<X&>(*p).*fn)(); } }; template <typename R, typename X> open_mem_fun<R, X> open_mem_fn(R (X::*fn)()) { return open_mem_fun<R, X>(fn); } 

결과 객체 적당한 std::function 객체를 통해 호출되어야한다 : 즉, 작성하는 직진되어야 즉, 'Base'에 대한 포인터로 호출 할 수 없습니다. 기본 클래스에서 (순수한) 가상으로 만들어야합니다. –

+0

제 아이디어는 사용자가 기본 클래스를 상속 한 클래스에서 함수를 구현 한 다음이 클래스에 함수를 전달하여 배열에 저장하고 지정된 특정 조건에서 함수를 호출 할 수있게하는 것입니다. –

+0

그러면'std :: vector , std :: function , std :: function >'과 같은 것이 필요할 것입니다. 어쩌면 교과서를 열고 상속이 어떻게 작동하는지 검토 할 수 있습니다. –

답변

2

난 당신이 std::mem_fn() 비슷하지만 개체 포인터를 변환하는 유연성과 뭔가를해야 할 거라고 생각합니다.

std::function<void(Base*)>(open_mem_fn(&X::XFunc)); 
+0

''C2440 오류 : '': 'open_mem_fun '에서 'std :: function '로 변환 할 수 없습니다. –

+1

@KysPlox : 전화로 컴파일러에 쉽게 액세스 할 수 없었습니다. 누락 된 템플릿 선언을 추가했지만 여전히 쉽게 테스트 할 수 없습니다. 필자는 오타를 수정해야 할 수도 있지만 전체적인 접근 방식이 효과가 있다는 것을 확신합니다. –

+1

@ DietmarKühl 지금 테스트 한 결과 제대로 작동합니다. – Quentin