You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:15:03