C++函数参数num_channels无法用作模板常量的高效解决办法
报错原因
C++ 中非类型模板参数必须是编译期可确定的常量,你使用的SmoothedFilterDesign类第二个模板参数Channels属于非类型模板参数,要求编译阶段就确定值。但你传入的num_channels是myFilter函数的入参,属于运行时才能确定值的变量,因此编译阶段无法完成模板实例化,触发报错。
最优解决方案
根据你的业务场景选对应的方案即可:
- 场景1:业务中用到的通道数是固定的有限枚举值(比如仅支持1、2、4、8通道)
不需要修改底层库代码,直接做运行时到编译期的分发即可,性能和原生模板实现完全一致,无额外开销:#include <stdexcept> #include <memory> std::unique_ptr<IIR::Filter> createSmoothedFilter(int filter_length, int num_channels) { switch(num_channels) { case 1: return std::make_unique<IIR::SmoothedFilterDesign<IIR::RBJ::Design::LowPass, 1>>(filter_length); case 2: return std::make_unique<IIR::SmoothedFilterDesign<IIR::RBJ::Design::LowPass, 2>>(filter_length); case 4: return std::make_unique<IIR::SmoothedFilterDesign<IIR::RBJ::Design::LowPass, 4>>(filter_length); // 按需添加其他你用到的通道数分支 default: throw std::invalid_argument("不支持的通道数配置"); } } void myFilter (int filter_length, int num_channels) { IIR::Filter* f = createSmoothedFilter(filter_length, num_channels).release(); // 后续原有业务逻辑 } - 场景2:业务通道数不固定,无法枚举完全
需要调整底层SmoothedFilterDesign的定义,把原本作为模板参数的Channels改为构造函数入参,改为运行时动态配置:// 修改后的SmoothedFilterDesign模板定义 template <class DesignClass, class StateType = DirectFormII> class SmoothedFilterDesign : public FilterDesign <DesignClass, StateType> { public: SmoothedFilterDesign(int filter_length, int channels) : m_channels(channels) { // 原有构造逻辑里用到Channels模板参数的地方,全部替换为m_channels成员变量 } private: int m_channels; }; // 调用代码直接传参即可 void myFilter (int filter_length, int num_channels) { IIR::Filter* f = new IIR::SmoothedFilterDesign < IIR::RBJ::Design::LowPass> (filter_length, num_channels); }
内容的提问来源于stack exchange,提问作者Nitin Singh
相关产品推荐
相关产品推荐

