假设我有一个设计用于表示任何维度的典型数学向量的类。我想设计这个类,使其构造函数接受任意数量的参数,将这些参数转换为long double类型,然后将它们插入到" point_list"矢量的顺序与参数列表中提供的顺序相同。
class Pvector
{
private:
std::vector<long double> point_list;
public:
// some magic constructor here
};
现在,如果所有参数都是相同的类型,这不会很困难,因为我可以使用初始化列表。但问题是任何参数都可能是不同的类型,这仍然需要接受任意数量的参数(至少一个)。基本上,我试图能够像这样使用构造函数:
int i;
float j;
double k;
long double l;
Pvector vec1(i, j, k, l);
Pvector vec2(k-i, 5, j);
Pvector vec3(i, i, j, j, k, k, l, l);
etc...
我不确定是否可以让一个可变参数构造函数接受多种类型,然后在将它们插入向量之前将它们隐式转换为长双精度。是否可以实现这一点,或者如果我想要一个可变参数构造函数,我的所有参数都必须是相同的类型?
答案 0 :(得分:1)
你可以这样做:
class Pvector
{
public:
template <typename ...Ts>
Pvector(Ts && ...ts)
{
point_list.reserve(sizeof...(Ts));
init(std::forward<Ts>(ts)...);
}
protected:
private:
void init() { };
template <typename ...Ts>
void init(long double x, Ts && ...ts)
{
point_list.push_back(x);
init(std::forward<Ts>(ts)...);
}
std::vector<long double> point_list;
};
答案 1 :(得分:0)
你可能会编写一个模板构造函数(这是一个比较简单的人可以避免匹配像class Pvector
{
private:
std::vector<long double> point_list;
public:
Pvector() = default;
Pvector(const Pvector&) = default;
Pvector(Pvector&&) = default;
// // SFINAE to avoid to match Pvector(Pvector& t)
template <typename T,
typename ... Ts,
std::enable_if_t<std::is_constructible<std::vector<long double>, T, Ts...>::value
&& (!std::is_same<Pvector, std::decay_t<T>>::value
|| sizeof...(Ts) != 0)>* = nullptr>
Pvector(T&& t, Ts&&... ts)
: point_list{t, ts...} {}
};
这样的东西。
class Pvector
{
private:
std::vector<long double> point_list;
public:
Pvector() = default;
Pvector(const Pvector&) = default;
Pvector(Pvector&&) = default;
Pvector(std::vector<long double>&& v) : point_list(std::move(v)) {}
};
但是将矢量作为参数
会更简单{
并使用额外的}
Pvector vec3({i, i, j, j, k, k, l, l});
{{1}}