使用整数初始化列表初始化长双精度的向量
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
,但我仍然希望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_list
的std::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 缩小转换是隐式转换 [...] 从整数类型 [...] 变为浮点类型,除非源是常量表达式,并且转换后的实际值将适合目标类型,并在转换回原始类型时生成原始值。
因此,每次将非常量整数表达式(即变量(转换为浮点类型时,您都会收到此警告。该值是否适合相应类型的尾数将取决于类型(浮点数、双精度、长双精度(和类型的实现。
相关文章:
- 初始化 std::vector 替换为单大括号而不是双大括号
- 为什么浮点数的矢量化比双精度更有效?
- 在C++中序列化浮点数/双精度,编译为 WebAssembly
- 为什么编译器接受具有长双精度文本的浮点数的初始化?
- C++ 具有双精度和长双精度的显式模板实例化
- C++ 警告:在一个声明中将截断从双精度初始化为浮点数,但在另一个声明中则不初始化
- 如何随机化双精度/浮点数据类型? C++
- 使用整数初始化列表初始化长双精度的向量
- 如何用NaN元素初始化双矩阵?
- 序列化双精度以通过 UDP(ARM 到 x86)传输
- 整数和双精度变量的初始化
- 如何初始化双**
- 定义最大双精度时"无法在初始化时将'double (*)() noexcept'转换为'double'"
- C++ 为什么我可以初始化静态常量字符,但不能初始化类定义中的静态常量双精度
- 初始化时无法将长整型*转换为双精度*
- 通过指针初始化常量矩阵<双精度,0,80>(来自 Dlib)
- 使用分数正确初始化双精度类型
- 初始化双链表
- 使用new初始化双大括号
- 使用双精度的 MSVC 大括号初始化似乎违反了该标准