c++ - 模板化的多态回调是个好主意吗?

标签 c++ templates polymorphism

我正在为游戏制作 Gui Api。用户始终可以在小部件上使用继承并覆盖,但我想要回调。我想使用模板化回调系统:

因此,如果他们想要为鼠标创建一个鼠标,他们可以从带有 mouseargs 的模板化回调基础版本继承:

所以基础看起来像这样:

template <typename T>

class AguiEventCallback {

public:
virtual void callback(AguiWidget* sender, T arg) = 0;

};

像这样将模板与多态性混合是一个好主意吗?我最好为我需要的每种类型(鼠标、键盘、游戏 handle 等)创建回调吗?

谢谢

最佳答案

看看 boost::function 和 boost::bind。接受一个带有针对特定事件定义的参数列表的函数对象,调用者可以做他们想做的事情。

这为回调实现提供了很大的灵活性,并且生成事件的对象需要更少的回调实现知识。

例如:

 typedef boost::function<void (AguiWidget* sender)> CallbackFunc;
 void register_callback(CallbackFunc const& f);

客户:

class Caller {
    void do_register() { register_callback(bind(&Caller::event, this, 123, _1)); }

    void event(int arg, AguiWidget* sender) { ... }
};

仅显示函数/绑定(bind),忽略许多其他问题;例如。内存管理,对象生命周期。

关于c++ - 模板化的多态回调是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4161588/

相关文章:

c++ - while循环中的除法

C++模板基础程序,链接器找不到构造函数和析构函数

c++ - 在 C++ 中为泛型实现线性探测

java - 静态绑定(bind)和动态绑定(bind)

c++ - 在 C++ 中调用初始化列表中的函数

c++ - char数组的左移操作

c++ - 隐式类型转换编译失败,这是为什么?

c++ - 遵循整数索引列表的自定义类迭代器?

java - 我应该实现 List 接口(interface)还是扩展 ArrayList 类

haskell - 在没有类型注释的情况下避免 let 绑定(bind)中的单态性