Variadic Constructor参数未知类型列表

时间:2017-08-25 13:52:56

标签: c++ vector initialization variadic

假设我有一个设计用于表示任何维度的典型数学向量的类。我想设计这个类,使其构造函数接受任意数量的参数,将这些参数转换为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...

我不确定是否可以让一个可变参数构造函数接受多种类型,然后在将它们插入向量之前将它们隐式转换为长双精度。是否可以实现这一点,或者如果我想要一个可变参数构造函数,我的所有参数都必须是相同的类型?

2 个答案:

答案 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}}