使用可变数量的浮点参数

e.f*_*man 12 c++ templates variadic-templates c++11

我正在尝试为我的struct Polynomial实现一个灵活的构造函数:

struct Polynomial
{
    std::vector<float> coefficients;
    size_t degree;
};
Run Code Online (Sandbox Code Playgroud)

多项式的程度是可变的.我想要的是拥有像这样的构造函数

Polynomial(float... _coefficients);
Run Code Online (Sandbox Code Playgroud)

我尝试过variadic模板:

template<float... Args>
Polynomial(Args... args);
Run Code Online (Sandbox Code Playgroud)

但浮动是非类型的,所以我做了:

template<typename... Args>
Polynomial(Args... args);
Run Code Online (Sandbox Code Playgroud)

但这允许我的系数是任何东西,而不是我想要的.我知道我可以使用:

Polynomial(size_t _degree, ...);
Run Code Online (Sandbox Code Playgroud)

但它真的不安全.

目前我正在使用:

Polynomial(std::vector<float>);
Run Code Online (Sandbox Code Playgroud)

但这迫使调用如下:

Polynomial P({f1, f2, f3}); // with fn floats
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否有一个很好的方法来做到这一点.

谢谢 !

Jod*_*cus 12

你可以使用initializer_list:

#include <vector>
#include <initializer_list>

struct Polynomial {
    std::vector<float> coeffs;
    std::size_t degree;

    Polynomial(std::initializer_list<float> init)
        : coeffs{ init }, degree(init.size()) { }
};

int main() {
    Polynomial p{ 1, 2, 3. };
}
Run Code Online (Sandbox Code Playgroud)

  • @alseether这是统一初始化,它是在C++ 11中添加的.您可以在C++参考上查找所有初始化规则,包括具有`initializer_list`构造函数的特性. (4认同)
  • 谢谢,我将检查与@ max66解决方案的区别.我想我将保留所有这三种方法 (2认同)

max*_*x66 3

我认为你的方法(向量参数,或者更好的(恕我直言)初始化列表)是一个好方法。

另一种方法(简单但有缺点)可能是使用缩小来确保可以缩小为 或 的Args...类型。就像是floatfloat

struct Polinomial
 {
   std::vector<double>  v;
   std::size_t          degree;

   template <typename ... Args>
   Polinomial (Args const & ... args)
      : v { float{args}... }, degree { sizeof...(Args) }
    { }
 };
Run Code Online (Sandbox Code Playgroud)

通过示例,它很简单并且有效

Polinomial p { 2.3f, 3.5f, 6.7f };
Run Code Online (Sandbox Code Playgroud)

但你的构造函数不接受,例如整数或doublelong double值;所以

Polinomial p { 2.3f, 3.5f, 6.7 };
// ........................^^^  double, error

Polinomial p { 2.3f, 3.5f, 6 };
// ........................^  int, error
Run Code Online (Sandbox Code Playgroud)

并且可能限制太多。