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

Initialize Vector of Long Doubles with Initialization List of Ints

本文关键字:初始化 双精度 向量 列表 整数      更新时间:2023-10-16

假设我有一个简单的类:

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_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中使用模板构造函数,并使用需要两个迭代器来初始化point_liststd::vector的构造函数。

#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 缩小转换是隐式转换 [...] 从整数类型 [...] 变为浮点类型,除非源是常量表达式,并且转换后的实际值将适合目标类型,并在转换回原始类型时生成原始值。

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