首页 > 解决方案 > 如何获取除第一个之外的函数参数?

问题描述

以下是我目前的实现:

struct Dual {
    float v;
    std::valarray<float> d;

    Dual(float v, std::valarray<float> d): v(v), d(d) {}
    Dual(float v, float d = 0.f): v(v), d({d}) {}
};

Dual d0{1.f};              // OK.
Dual d1{1.f, 1.f};         // OK.
// Dual d2{1.f, 1.f, 1.f}; // Error. I want this.
Dual d2{1.f, {1.f, 1.f}};  // OK.    I don't want this.

是否可以只使用一个构造函数?

所以这Dual d2{1.f, 1.f, 1.f};也没关系。

也许像这样(无法编译):

struct Dual {
    float v;
    std::valarray<float> d;

    Dual(float v, float d...): v(v), d({d...}) {}
};

Dual d0{1.f};
Dual d1{1.f, 1.f};
Dual d2{1.f, 1.f, 1.f}; // I want this.

我应该使用可变参数模板还是std::initilizer_list<>

以及如何使用?

标签: c++variadic-templatesvariadic-functions

解决方案


您可以编写一个带有可变数量参数的构造函数,如下所示:

template<typename ...Ts>
Dual(float v, Ts ...ts) : v(v), d({ts...}) {}

这是一个演示

使用 c++20,您可以将其简化为:

Dual(float v, std::floating_point auto ...ts) : v(v), d({ts...}) {}

与以前的版本相比,这具有优势,即构造函数将只接受浮点值。(即使以前的版本会警告缩小转换)。

这是一个演示


推荐阅读