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

luc*_*v67 3 c++ templates constructor struct

为了使我的问题更清楚,首先我向您展示我的模板化结构,用于根据维度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{};
};
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以构建一个state具有 3 个维度的变量:

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

但我想知道:

我可以定义变量状态而不提供 V 形中的维度值,而只能通过编译从我在构造函数中提供的值的数量中推断出它吗?例如 :

// 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};
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助!

Evg*_*Evg 6

只需添加一个扣除指南

template<class... Ts>
State(Ts...) -> State<sizeof...(Ts)>;
Run Code Online (Sandbox Code Playgroud)

演示

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

template<class... Ts>
State<sizeof...(Ts)> makeState(Ts... values) {
    return State<sizeof...(Ts)>(values...);
}
Run Code Online (Sandbox Code Playgroud)