背景
最近在看webrtc
的代码,看到音视频编解码器的创建部分,使用了c++11
的可变参数模板,实现了编解码器的工厂模式,觉得挺有意思的分享一下。下文中的例子对webrtc
的代码做了精简,抽取了与本文主题相关的部分,以音频编码器的创建为例进行说明。
音频编码器类
这部分没有新意,常规操作。基类AudioEncoder
,然后派生出两个音频编码器AudioEncoderG711Impl
和AudioEncoderOpusImpl
。代码如下:
class AudioEncoder {
public:
void Show() {
cout << "hi, I am " << name_ << "Encoder." << endl; }
protected:
explicit AudioEncoder(string name) : name_(std::move(name)) {
}
private:
string name_;
};
class AudioEncoderG711Impl : public AudioEncoder {
public:
explicit AudioEncoderG711Impl(const string &name) : AudioEncoder(name) {
}
};
class AudioEncoderOpusImpl : public AudioEncoder {
public:
explicit AudioEncoderOpusImpl(const string &name) : AudioEncoder(name) {
}
};
工厂模板类
基类AudioEncoderFactory
,派生一个可变参数模板工厂类AudioEncoderFactoryT
。CreateAudioEncoderFactory()
一个工厂类创建函数。关注下语法即可,也没什么难理解。算是本文的一个设计层面的技术点。代码如下:
class AudioEncoderFactory {
public:
virtual ~AudioEncoderFactory() = default;
virtual vector<string> GetSupportedEncoders() = 0;
virtual Audio