c++ - 用专门的版本覆盖多个继承的模板函数

标签 c++ templates overriding multiple-inheritance specialization

好的,先上示例代码;这是我试图传达我正在尝试做的事情的尝试,尽管它无法编译:

#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

关于c++ - 用专门的版本覆盖多个继承的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1897675/

相关文章:

c++ - 模板和矩阵转换

c++ - 有条件地包含/排除类模板内的数据成员

c++ - std::get<0>(...) 和枚举索引

c++ - 如何在图中找到 3 条边的负加权循环?

c++ - const 应该用于捕获错误还是用于文档?

c++ - 从多个 2D 点重建 3D 点?

c++ - 可变参数模板的声明点

java - 如何在Java中编写重写方法

c# - 如何正确继承克隆方法?

ruby - 重写 Ruby 中的 == 运算符