C++ 使用INT初始化列表初始化长双精度向量

C++ 使用INT初始化列表初始化长双精度向量,c++,list,vector,initialization,C++,List,Vector,Initialization,假设我有一个简单的类: 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

假设我有一个简单的类:

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

这是因为我的算术运算的结果类型是
int
。所以我似乎陷入了一个难题。我希望能够将整数直接传递到
Pvector
的构造函数中,但我仍然希望
point\u list
的类型为
long double
,并且(以某种方式)用我传递的整数初始化。我该怎么做呢?

解决方案1

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

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

您可能会收到缩小转换范围的警告,对吗

被盗自:

C++11 8.5.4/7缩小转换是一种隐式转换 […]从整数类型[…]到浮点类型,除非源是常量表达式,否则转换后的实际值将适合目标类型,并在转换回原始类型时生成原始值


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

我知道这一点,但我仍然不确定在传递整数类型的变量时该怎么办。现在我想起来了,我想我可以静态地将它们每一个都转换为长双精度,但这也不一定是最理想的解决方案。@JohnTravolski,这对我来说不是很清楚。我不确定传入整数类型的变量是一个什么样的问题。啊哈,您的第二个解决方案似乎已经纠正了这个问题。我现在可以使用非常量整数值和变量初始化我的Pvector,即使没有第二个构造函数。谢谢,我感谢您提供的额外信息。你说得对,那是我收到的警告。
#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};
}
#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};
}