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)
我认为你的方法(向量参数,或者更好的(恕我直言)初始化列表)是一个好方法。
另一种方法(简单但有缺点)可能是使用缩小来确保可以缩小为 或 的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)
但你的构造函数不接受,例如整数或double或long 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)
并且可能限制太多。
| 归档时间: |
|
| 查看次数: |
805 次 |
| 最近记录: |