std :: function과 함께 다형성을 어떻게 사용할 수 있습니까?

요 차이 티머

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

그놈과 함께 Awesome WM을 어떻게 사용할 수 있습니까?

분류에서Dev

ForEach 목록과 함께 RandomAccessCollection을 어떻게 사용할 수 있습니까?

분류에서Dev

Netty에서 NioDatagramChannel과 함께 EventExecutorGroup을 어떻게 사용할 수 있습니까?

분류에서Dev

apache camel과 함께 elasticsearch 2.2.1을 어떻게 사용할 수 있습니까?

분류에서Dev

knex의 where 절과 함께 hasColumn을 어떻게 사용할 수 있습니까?

분류에서Dev

x : String과 함께 x : Static을 어떻게 사용할 수 있습니까?

분류에서Dev

일반 레코드 및 테이블 유형과 함께 'InsertQuery'를 어떻게 사용할 수 있습니까?

분류에서Dev

nodejs에서 babel과 함께 이것을 어떻게 사용할 수 있습니까?

분류에서Dev

Neo4j에서`call.apoc.do.when`과 함께`with` 문을 어떻게 사용할 수 있습니까?

분류에서Dev

목록 대신 ObservableCollection과 함께 Xamarin DataTemplate을 어떻게 사용할 수 있습니까?

분류에서Dev

TrueCrypt 암호화 된 백업 대상과 함께 Windows 백업을 어떻게 사용할 수 있습니까?

분류에서Dev

ipv6 기반 루프백에 :: 1과 함께 curl을 어떻게 사용할 수 있습니까?

분류에서Dev

Mountain Lion에서 Homebrew MacVim과 함께 Homebrew Python을 어떻게 사용할 수 있습니까?

분류에서Dev

Linq2Sql과 함께 gridpanel에서 ext : CheckColumn을 어떻게 사용할 수 있습니까?

분류에서Dev

Gradle 2.2.1에서 Java 1.8과 함께 Findbugs 3.0.1을 어떻게 사용할 수 있습니까? : java.lang.ArrayIndexOutOfBoundsException :

분류에서Dev

파일 이름 및 옵션과 함께 git log 명령을 어떻게 사용할 수 있습니까?

분류에서Dev

std :: atomic을 OpenMP와 함께 안전하게 사용할 수 있습니까?

분류에서Dev

`paste0`과 함께`I ()`를 어떻게 사용할 수 있습니까?

분류에서Dev

std :: function을 사용하여 클래스의 인스턴스를 생성하지 않고 멤버 함수를 어떻게 사용할 수 있습니까?

분류에서Dev

std :: function을 사용하여 클래스의 인스턴스를 생성하지 않고 멤버 함수를 어떻게 사용할 수 있습니까?

분류에서Dev

어떻게 든 .setMicrosecondPosition ()을 라인과 함께 사용할 수 있습니까 아니면 클립으로 만 할 수 있습니까?

분류에서Dev

C ++ 20 std :: format을 어떻게 사용할 수 있습니까?

분류에서Dev

SwiftUI와 함께 InAppSettingsKit을 어떻게 사용할 수 있습니까?

분류에서Dev

mobx-state-tree와 함께 jsDoc을 어떻게 사용할 수 있습니까?

분류에서Dev

mapboxgl과 함께 Google 위성 레이어를 사용할 수 있습니까?

분류에서Dev

mongoDB의 $ group과 함께 다른 사용자 정의 필드에서 count / {$ sum : 1}을 어떻게 사용할 수 있습니까?

분류에서Dev

여러 사용자 클래스 및 다른 데이터베이스 항목과 함께 flask_login을 어떻게 사용할 수 있습니까?

분류에서Dev

Arrays.fill을 2D 배열과 함께 사용할 수 있습니까? 그렇다면 어떻게해야합니까?

분류에서Dev

멤버 함수를 std :: function에 어떻게 바인딩 할 수 있습니까?

Related 관련 기사

  1. 1

    그놈과 함께 Awesome WM을 어떻게 사용할 수 있습니까?

  2. 2

    ForEach 목록과 함께 RandomAccessCollection을 어떻게 사용할 수 있습니까?

  3. 3

    Netty에서 NioDatagramChannel과 함께 EventExecutorGroup을 어떻게 사용할 수 있습니까?

  4. 4

    apache camel과 함께 elasticsearch 2.2.1을 어떻게 사용할 수 있습니까?

  5. 5

    knex의 where 절과 함께 hasColumn을 어떻게 사용할 수 있습니까?

  6. 6

    x : String과 함께 x : Static을 어떻게 사용할 수 있습니까?

  7. 7

    일반 레코드 및 테이블 유형과 함께 'InsertQuery'를 어떻게 사용할 수 있습니까?

  8. 8

    nodejs에서 babel과 함께 이것을 어떻게 사용할 수 있습니까?

  9. 9

    Neo4j에서`call.apoc.do.when`과 함께`with` 문을 어떻게 사용할 수 있습니까?

  10. 10

    목록 대신 ObservableCollection과 함께 Xamarin DataTemplate을 어떻게 사용할 수 있습니까?

  11. 11

    TrueCrypt 암호화 된 백업 대상과 함께 Windows 백업을 어떻게 사용할 수 있습니까?

  12. 12

    ipv6 기반 루프백에 :: 1과 함께 curl을 어떻게 사용할 수 있습니까?

  13. 13

    Mountain Lion에서 Homebrew MacVim과 함께 Homebrew Python을 어떻게 사용할 수 있습니까?

  14. 14

    Linq2Sql과 함께 gridpanel에서 ext : CheckColumn을 어떻게 사용할 수 있습니까?

  15. 15

    Gradle 2.2.1에서 Java 1.8과 함께 Findbugs 3.0.1을 어떻게 사용할 수 있습니까? : java.lang.ArrayIndexOutOfBoundsException :

  16. 16

    파일 이름 및 옵션과 함께 git log 명령을 어떻게 사용할 수 있습니까?

  17. 17

    std :: atomic을 OpenMP와 함께 안전하게 사용할 수 있습니까?

  18. 18

    `paste0`과 함께`I ()`를 어떻게 사용할 수 있습니까?

  19. 19

    std :: function을 사용하여 클래스의 인스턴스를 생성하지 않고 멤버 함수를 어떻게 사용할 수 있습니까?

  20. 20

    std :: function을 사용하여 클래스의 인스턴스를 생성하지 않고 멤버 함수를 어떻게 사용할 수 있습니까?

  21. 21

    어떻게 든 .setMicrosecondPosition ()을 라인과 함께 사용할 수 있습니까 아니면 클립으로 만 할 수 있습니까?

  22. 22

    C ++ 20 std :: format을 어떻게 사용할 수 있습니까?

  23. 23

    SwiftUI와 함께 InAppSettingsKit을 어떻게 사용할 수 있습니까?

  24. 24

    mobx-state-tree와 함께 jsDoc을 어떻게 사용할 수 있습니까?

  25. 25

    mapboxgl과 함께 Google 위성 레이어를 사용할 수 있습니까?

  26. 26

    mongoDB의 $ group과 함께 다른 사용자 정의 필드에서 count / {$ sum : 1}을 어떻게 사용할 수 있습니까?

  27. 27

    여러 사용자 클래스 및 다른 데이터베이스 항목과 함께 flask_login을 어떻게 사용할 수 있습니까?

  28. 28

    Arrays.fill을 2D 배열과 함께 사용할 수 있습니까? 그렇다면 어떻게해야합니까?

  29. 29

    멤버 함수를 std :: function에 어떻게 바인딩 할 수 있습니까?

뜨겁다태그

보관