如何在不提供尖括号信息的情况下调用专门的结构模板?

3
为了让我的问题更清楚,首先我向您展示我的模板结构体State,以描述状态空间的状态向量,根据维度而定:
template<unsigned int Dimension>
struct State;

// Specialization : for dimension 1
template<>
struct State<1>
{
    State() = default;
    State(double x) : x{ x } {}

    double x{};
};

// Specialization : for dimension 2
template<>
struct State<2>
{
    State() = default;
    State(double x, double dx) : x{ x }, dx{ dx } {}

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

// Specialization : for dimension 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{};
};

通过这种方式,我可以使用三个维度构建一个state变量:

  • 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);

但我在想:

我能否定义一个变量state,而不提供尖括号中的维数值,而只需编译器从我在构造函数中提供的值的数量中推断出它。例如:

// What i would like to be able to do
auto state = State{2.0, 4.7}; // FAILED ( 2 values provided, so I would like the compilator to deduce it's the constructor of State<2> )
// Instead of doing
auto state = State<2>{2.0, 4.7};

感谢您的帮助!

1个回答

6
只需添加一个 抵扣指南
template<class... Ts>
State(Ts...) -> State<sizeof...(Ts)>;

演示

在C++17之前,一个典型的解决方案是引入一个辅助函数:

template<class... Ts>
State<sizeof...(Ts)> makeState(Ts... values) {
    return State<sizeof...(Ts)>(values...);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接