我正在编写一个音频渲染库,它将作为输入音频缓冲区,执行一些操作,然后管理选定设备上的播放。对于这个任务,我决定使用 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/