문제

좋아요, 먼저 샘플 코드를 작성하세요.이것은 컴파일되지는 않지만 내가 하려는 것이 무엇인지 전달하려는 나의 시도입니다.

#include <iostream>

template <class T>
class Base
{
public:
    virtual void my_callback() = 0;
};

class Derived1
    : public Base<int>
    , public Base<float>
{
public:
    void my_callback<int>()
    {
        cout << "Int callback for Derived1.\n";
    }
    void my_callback<float>()
    {
        cout << "Float callback for Derived\n";
    }
};

class Derived2
    : public Base<int>
    , public Base<float>
{

public:
    void my_callback<int>()
    {
        cout << "Int callback for Derived2.\n";
    }
    void my_callback<float>()
    {
        cout << "Float callback for Derived2\n";
    }

};

int main()
{
    {
        Derived1 d;
        Base<int> * i_p = d;
        Base<float> * i_f = d;

        i_p->my_callback();
        i_f->my_callback();
    }
    {
        Derived2 d;
        Base<int> * i_p = d;
        Base<float> * i_f = d;

        i_p->my_callback();
        i_f->my_callback();
    }

    //Desired output:
    // Int callback for Derived1.
    // Float callback for Derived1
    // Int callback for Derived2.
    // Float callback for Derived2
    system("Pause");
}

그래서 제가 하려는 것은 상속할 일종의 래퍼 클래스를 만들어 파생 클래스를 다양한 콜백 목록에 자동으로 연결하는 것입니다.파생 클래스의 특정 인스턴스를 목록에 연결해야 하며, 보시다시피 "사용자"가 파생 클래스를 만드는 과정의 일부로 콜백 함수를 만들거나 가져오기를 원합니다.

다른 구문을 사용해야 할 수도 있지만 이것이 작동할 수 있을 것 같습니다.작동하지 않는다면 제안할 사항이 있나요?

도움이 되었습니까?

해결책

예,이 작업을 수행 할 수 있습니다.

#include <iostream>
using namespace std;

template <class T>
class Base
{
public:
  virtual void my_callback() = 0;
};

class Derived1 : public Base<int>, public Base<float>
{
public:
  void Base<int>::my_callback() {
    cout << "Int callback for Derived1.\n";
  }
  void Base<float>::my_callback() {
    cout << "Float callback for Derived\n";
  }
};

class Derived2 : public Base<int>, public Base<float>
{
public:
  void Base<int>::my_callback() {
    cout << "Int callback for Derived2.\n";
  }
  void Base<float>::my_callback() {
    cout << "Float callback for Derived2\n";
  }
};

int main()
{
  {
    Derived1 d;
    Base<int> * i_p = &d;
    Base<float> * i_f = &d;
    i_p->my_callback();
    i_f->my_callback();
  }
  {
    Derived2 d;
    Base<int> * i_p = &d;
    Base<float> * i_f = &d;
    i_p->my_callback();
    i_f->my_callback();
  }
}

산출:

Int callback for Derived1.
Float callback for Derived
Int callback for Derived2.
Float callback for Derived2

다른 팁

당신이 원하는 것은 불가능하다.

템플릿 전문화를 추가할 수 있지만 이것이 실제로 도움이 되는지 모르겠습니다.

template <class T>
class Base {
public:
  virtual void my_callback() = 0;
};

template <>
class Base<int> {
public:
  virtual void my_callback() {
    cout << "Base<int>::my_callback()\n";
  }
};

template <>
class Base<float> {
public:
  virtual void my_callback() {
    cout << "Base<float>::my_callback()\n";
  }
};

class Derived1 : public Base<int>, public Base<float> {
public:
  // NOTE: no my_callback() implementation here
};

class Derived2 : public Base<int>, public Base<float> {
public:
  virtual void my_callback() {
    cout << "Derived2::my_callback()\n";
  }
};


int main()
{
  {
    Derived1 d;
    Base<int> * i_p = &d;
    Base<float> * i_f = &d;
    i_p->my_callback();
    i_f->my_callback();
  }
  {
    Derived2 d;
    Base<int> * i_p = &d;
    Base<float> * i_f = &d;
    i_p->my_callback();
    i_f->my_callback();
  }
}

산출:

Base<int>::my_callback()
Base<float>::my_callback()
Derived2::my_callback()
Derived2::my_callback()

이유를 설명해 보겠습니다.

Derived1 d;
Base<int> * i_p = &d;
Base<float> * i_f = &d;

// will check the vtable, and will call
//  either Derived1::my_callback
//  OR Base<int>::my_callback
i_p->my_callback();

// will check the vtable, and will call
//  either Derived1::my_callback
//  OR Base<float>::my_callback
i_f->my_callback();

vtable을 통해 Derived1 클래스에 my_callback()의 두 가지 버전이 있지만 둘 중 하나를 재정의할 수 없으며 두 가지를 동시에 재정의할 수만 있습니다(예제에서 Derived2가 하는 것처럼)!

"my_callback1()"과 "my_callback2()" 두 가지 메소드만 제공하면 됩니다.

템플릿 클래스를 사용하든 비 테일 플레이트를 사용하든 이는 Helper 클래스를 사용하여 수행 할 수 있습니다. 이 스타일 또는 이 하나.

(Microsoft 특정 적격 이름을 사용하지 않을 경우 이것은 유일한 휴대용 솔루션 인 것 같습니다.)

그렇지 않습니다 가상 와 관련된 주형 머리에 알람이 올라가나요? ;)

정적 또는 역동적 인 쪽을 선택해야합니다.

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