如何无需指定尖括号维度,让编译器推导特化的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
相关产品推荐
相关产品推荐

