C++类模板隐式推导:模板移至类外是否可保留参数自动推导
解决方案
方案1:使用C++17及以上版本的类模板实参推导(CTAD)
C++17标准引入了*类模板实参推导(CTAD)*特性,支持直接通过构造函数的入参自动推导类模板的参数,不需要额外编码即可实现你要的效果,代码写法和原来的非模板类完全一致:
// 不需要显式指定V,编译器会根据c的类型自动推导 objective_QP f(Q, c);
如果你的构造函数参数使用了Eigen的MatrixBase这类CRTP基类,为了避免推导失败,可以额外添加显式推导指引:
// 适配单构造函数的推导指引 template <typename V> objective_QP(const spMat&, const VecBase<V>&) -> objective_QP<V>; // 适配多参数构造函数的推导指引 template <typename V> objective_QP(const spMat&, const spMat&, const VecBase<V>&, const VecBase<V>&) -> objective_QP<V>;
添加推导指引后,哪怕你传入的是Eigen的矩阵块、表达式等非直接VectorXd类型的参数,也能正确推导出模板参数V的类型。
方案2:兼容C11/C14的工厂函数实现
如果你的项目需要兼容老版本C++标准,可以实现一个模板工厂函数,函数模板的参数可以自动推导,不需要显式指定:
// 工厂函数重载1:无约束项的场景 template <typename V> objective_QP<V> make_objective_qp(const spMat& Q_, const VecBase<V>& c_) { return objective_QP<V>(Q_, c_); } // 工厂函数重载2:带约束项的场景 template <typename V> objective_QP<V> make_objective_qp(const spMat& Q_, const spMat& A_, const VecBase<V>& b_, const VecBase<V>& c_) { return objective_QP<V>(Q_, A_, b_, c_); }
使用时直接调用工厂函数即可,不需要指定模板参数:
auto f = make_objective_qp(Q, c);
内容的提问来源于stack exchange,提问作者Jonas Hjulstad
相关产品推荐
相关产品推荐

