2 개의 클래스가 있다고 가정 해 보겠습니다.
class A {}
class B : public A {}
그리고 나는 Astd::function
유형의 수신 을 사용하고 싶지만 A ( B 와 같은 ) 에서 상속하는 클래스를 수신하는 메소드를 할당합니다 .
void myFun(B bbbb) {}
std::function<void(A)> blah = std::bind(myFun, _1);
컴파일러가 묵시적으로 다운 캐스트되지 않기 때문에 이것은 분명히 작동하지 않습니다.
하지만 어떻게 이렇게 할 수 있습니까? 기본적으로 몇 가지 기본 std :: function 유형의 맵을 보유하고 싶고 매핑 된 각 값에서 Bstd::function
와 같은 파생 유형에 대해 보유합니다 .
캐스트 연산자를 자리 표시 자에 바인딩하는 방법이 있습니까?
좋아, 나는 결국 해결 방법을 마쳤습니다.
컴파일러는 암시 적으로 다운 캐스트하는 것을 허용하지 않으므로 캐스트 메서드를 바인딩했습니다.
따라서 모든 일반 및 템플릿을 유지하기 위해 다음과 같이 진행됩니다.
첫째, 함수 인수 유형을 가져 오는 도우미 클래스 :
template <typename T>
class GetFunctionArgumentVal;
template <class T, typename U >
class GetFunctionArgumentVal<std::function<U(T)>>
{
public:
typedef T arg;
typedef U returnVal;
};
그런 다음 static_cast를 사용하여 캐스트 (컴파일 시간 형식 안전성 유지)하는 캐스트 연산자가 파생 된 클래스를 사용하여 함수를 호출합니다.
template <typename FUNCTION, typename BASE>
void castAndCall(FUNCTION bf, BASE& temp)
{
bf(static_cast< GetFunctionArgumentVal<FUNCTION>::arg >(temp));
}
사용 예 :
class A {};
class B : public A {};
class C : public A {};
void targetB(B& temp)
{
}
void targetC(C& temp)
{
}
std::function<void(A &)> af;
std::function<void(B &)> bf = targetB;
std::function<void(C &)> cf = targetC;
B b;
C c;
af = std::bind(castAndCall<decltype(bf),A>,bf,std::placeholders::_1);
af(b);
af = std::bind(castAndCall<decltype(cf),A>,cf,std::placeholders::_1);
af(c);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다