c++ - 从没有 Qt、STL 或 Boost 的 C++98 接口(interface)连接 Qt 槽和信号

标签 c++ qt

我正在编写一个音频渲染库,它将作为输入音频缓冲区,执行一些操作,然后管理选定设备上的播放。对于这个任务,我决定使用 Qt 的 QAudioOutput 类。

我想允许用户在 QAudioOutput 对象的状态发生变化(事件、暂停、停止和空闲)时设置回调。我会将这些信号连接到将调用用户定义的回调的信号处理程序。但是,我有以下限制:库头上没有 STL、Qt、Boost。我还需要与 C++98 保持兼容。

现在,我有 2 个解决方案(有缺点),我正在寻求改进设计。我的第一个解决方案是:

// library header
class AudioLibrary
{
    typedef void ( *Callback )();
    void setOnActiveCallback( Callback cb );
};

此解决方案的问题是客户端只能传递静态函数或非捕获 lambda。这限制太多了。想象一下,一个客户想要做一些简单的事情,比如在播放结束后重新启用一个按钮。如果按钮是成员变量,则不可能。

我的第二个解决方案是我的接口(interface)将是一个抽象类并包含纯虚函数,这些函数将包含状态更改时所需的行为。但是,我不确定这对图书馆的客户来说是否会很有趣...

有没有我忘记想到的更清洁和/或更好的解决方案?

最佳答案

这听起来像是 C 风格的回调。

class AudioLibrary
{
    typedef void ( *Callback )( void * );
    void setOnActiveCallback( Callback cb, void * context );

    // Perhaps also include
    template <typename Func>
    void setOnActiveCallback( Func & f )
    {
        setOnActiveCallback( &Func::operator(), &f );
    }
};

关于c++ - 从没有 Qt、STL 或 Boost 的 C++98 接口(interface)连接 Qt 槽和信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45617807/

相关文章:

c++ - MSVC 无法返回可以复制但不能移动的对象

c++ - QString 仅替换第一次出现

qt - 如何在嵌入式 Web 浏览器中支持 window.print()?

c++ - 有没有办法在 QDomDocument 中执行 javascript?

c++ - 如何将 QImage 中的像素数据转换为另一种格式?

c++ - BlackBerry 10 中的反向地理编码

c++ - 如何告诉c++编译器对象在别处没有改变以达到更好的优化

c++ - 错误 : '::main' must return 'int'

c++ - 初始化私有(private)静态变量c++

c++ - 公共(public)接口(interface)中使用的私有(private) typedef