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

如何无需指定尖括号维度,让编译器推导特化的State结构体模板?

让编译器根据构造参数数量自动推导State模板的维度

以下是用于描述状态空间状态向量的模板结构体State,通过维度特化实现不同维度的状态存储:

template<unsigned int Dimension>
struct State;

// 特化:维度1
template<>
struct State<1>
{
    State() = default;
    State(double x) : x{ x } {}

    double x{};
};

// 特化:维度2
template<>
struct State<2>
{
    State() = default;
    State(double x, double dx) : x{ x }, dx{ dx } {}

    double x{};
    double dx{};
};

// 特化:维度3
template<>
struct State<3>
{
    State() = default;
    State(double x, double dx, double ddx) : x{ x }, dx{ dx }, ddx{ ddx } {}

    double x{};
    double dx{};
    double ddx{};
};

目前创建对象时必须显式指定模板维度参数:

  • 1维:auto state = State<1>(2.0);
  • 2维:auto state = State<2>(2.0, 4.7);
  • 3维:auto state = State<3>(2.0, 4.7, 5.9);

需求

希望无需显式指定维度,让编译器根据构造函数的参数数量自动推导对应的特化版本,例如:

// 期望实现的写法
auto state = State{2.0, 4.7}; // 自动推导为State<2>

解决方案

利用C++17引入的类模板推导指引,为State添加对应参数数量的推导规则,让编译器自动匹配模板维度:

// 1个double参数 → State<1>
State(double) -> State<1>;

// 2个double参数 → State<2>
State(double, double) -> State<2>;

// 3个double参数 → State<3>
State(double, double, double) -> State<3>;

添加推导指引后,即可直接用以下方式创建对象,编译器会自动推导维度:

auto state1 = State{2.0};          // 推导为State<1>
auto state2 = State{2.0, 4.7};     // 推导为State<2>
auto state3 = State{2.0, 4.7, 5.9};// 推导为State<3>

如果需要支持无参数的默认构造(比如默认维度),可以补充对应的推导指引(需确保有对应维度的特化):

// 无参数时默认推导为State<1>,可根据需求调整
State() -> State<1>;

注意:该特性依赖C++17及以上标准,需确保编译器开启对应版本支持。

内容的提问来源于stack exchange,提问作者lucas_v67

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:52:48