未知类型的可变参数构造函数参数列表
问题描述:
假设我有一个类用于表示任何维度中的典型数学向量。我想设计这个类,使它的构造函数接受任意数量的参数,将这些参数转换为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...
我只是不知道是否有可能有一个可变参数的构造函数接受多种类型,然后暗中将它们转换为长双打前插入他们进入矢量。是否有可能实现这一点,或者如果我想要一个可变参数构造函数,我的所有参数都必须是相同的类型吗?
答
你可以做这样的:。
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;
};
+0
事实上,它不会破坏一些复制/移动构造函数,这有点棘手。 – Jarod42
答
你可能会写一个模板的构造函数(这是棘手的,人们可以预期,以避免匹配诸如Pvector(Pvector&)
事情
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});
你有没有考虑只是采取'的std ::矢量'在构造函数中,让'的std :: VECTOR'照顾它?你将不得不使用'Pvector vec1({i,j,k,l});'。 –
nwp
我不知道是否可以使用[参数包](http://en.cppreference.com/w/cpp/language/parameter_pack)与构造函数,但它可能值得尝试。 –
我不明白是什么问题。 [只要做到这一点](https://ideone.com/ZvjlT9),没有必要乱用variadic模板 – user463035818