繁体   English   中英

使用Ints的初始化列表初始化长双打的向量

[英]Initialize Vector of Long Doubles with Initialization List of Ints

假设我有一个简单的类:

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的构造Pvector ,但我仍然希望point_list的类型为long double并且(不知何故)使用我传入的整数进行初始化。我怎么能这样做呢?

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

您可能会收到一个narrowing conversion warning ,对吧?

这里来的

C ++ 11 8.5.4 / 7 变窄转换是从整数类型到浮点类型的隐式转换, 除非源是常量表达式而后是实际值转换将适合目标类型,并在转换回原始类型时生成原始值。

因此,每次将非常量整数表达式(即变量)转换为浮点类型时,您都会收到此警告。 该值是否适合相应类型的尾数将取决于类型(float,double,long-double)和类型的实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM