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

5

假设我有一个简单的类:

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)
  {}
};

这段代码无法编译,因为以类型long double模板化的std::vector不能从以类型int模板化的初始化列表进行初始化。尽管如此,去除第二个构造函数会带来不便,因为在我的代码中我无法执行以下操作:

Pvector piece_movement({E.X - S.X, E.Y - S.Y, E.Z - S.Z});

这是因为我的算术操作的结果类型是 int。所以我似乎陷入了困境。我想直接将整数传递给 Pvector 的构造函数,但我仍希望point_listlong double 类型,并且(某种方式)使用我传递的整数进行初始化。我应该如何解决这个问题?
2个回答

4

解决方案1

您可以删除第二个构造函数,仍然可以使用以下方式构建PVector

 Pvector v2{1, 2};

例子:

#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};
}

解决方案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};
}

我知道这一点,但是在传递整数类型的变量时,我仍然不确定该怎么做。现在我想了想,我可以将它们中的每一个静态转换为长双精度,但这也不一定是最理想的解决方案。 - JohnTravolski
@JohnTravolski,我不是很清楚你的意思。我不确定传递整数类型的变量会有什么问题。 - R Sahu
1
啊哈,你的第二个解决方案似乎已经修正了问题。现在我可以使用非常量整数值和变量来初始化我的Pvector,即使没有第二个构造函数。 - JohnTravolski

2
您可能会收到“缩小转换警告”,对吗?
从这里(链接)偷来的:
引用如下: C++11 8.5.4/7 中,“缩小转换”是指从整数类型转换为浮点类型的隐式转换[...],除非源是常量表达式,并且在转换后实际值适合目标类型并且在转换回原始类型时产生原始值。
因此,每次将非常量整数表达式(即变量)转换为浮点类型时,都会收到此警告。值是否适合相应类型的尾数将取决于类型(float、double、long-double)和类型的实现。

谢谢,我很感激这些额外的信息。你说得对,那就是我收到的警告。 - JohnTravolski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接