使用整数初始化列表初始化长双精度向量

Joh*_*ski 5 c++ initialization list vector

假设我有一个简单的类:

class Pvector
{
  private:
  std::vector<long double> point_list;

  public:
  Pvector(std::initializer_list<long double> coords) : point_list(coords)
  {}
  Pvector(std::initializer_list<int> coords) : point_list(coords)
  {}
};
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为std::vector模板化类型long double无法从模板化类型初始化列表中初始化自身int。然而,这相当不方便,因为删除了第二个构造函数后,我无法在代码中执行以下操作:

Pvector piece_movement({E.X - S.X, E.Y - S.Y, E.Z - S.Z});
Run Code Online (Sandbox Code Playgroud)

这是因为我的算术运算的结果类型是 类型int。所以我似乎陷入了困境。我希望能够将整数直接传递到 for 的构造函数中Pvector,但我仍然希望point_list是类型long double并且(以某种方式)使用我传入的整数进行初始化。我该如何去做呢?

R S*_*ahu 4

解决方案1

您可以删除第二个构造函数,但仍然可以PVector使用

 Pvector v2{1, 2};
Run Code Online (Sandbox Code Playgroud)

例子:

#include <initializer_list>
#include <vector>

class Pvector
{
  private:
  std::vector<long double> point_list;

  public:
  Pvector(std::initializer_list<long double> coords) : point_list(coords)
  {}
};

int main()
{
   Pvector v1{1.0, 2.0};
   Pvector v2{1, 2};
}
Run Code Online (Sandbox Code Playgroud)

解决方案2

在 中使用模板构造函数,Pvector并使用 的构造函数std::vector需要两个迭代器来初始化point_list

#include <initializer_list>
#include <vector>

class Pvector
{
  private:
  std::vector<long double> point_list;

  public:

  // This is not necessary any more.
  // Pvector(std::initializer_list<long double> coords) : point_list(coords){}

  template <typename T>
  Pvector(std::initializer_list<T> coords) : point_list(coords.begin(), coords.end()){}
};

int main()
{
   Pvector v1{1.0, 2.0};
   Pvector v2{1, 2};
}
Run Code Online (Sandbox Code Playgroud)