2017-08-25 175 views
4

的初始化列表假设我有一个简单的类:初始化向量与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 doublestd::vector本身不能从模板上int类型的初始化列表初始化。这是相当不方便,但是,由于与第二构造去掉,我不能做我的代码如下:

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

这是因为我的数学运算得到的类型是int类型。所以我似乎陷入了一个难题。我希望能够将整数直接传递给Pvector的构造函数,但我仍然希望point_list的类型为long double,并且(以某种方式)用我传入的整数初始化。我该如何去做这件事?

回答

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

我知道这一点,但我仍然不确定在传递整型变量的情况下该怎么做。现在我想到了,我想我可以静态地将它们中的每一个都放大一倍,但这不一定是最理想的解决方案。 – JohnTravolski

+0

@JohnTravolski,这不是很清楚。我不知道如何传递整数类型的变量是一个问题。 –

+1

啊哈,你的第二个解决方案似乎已经纠正了这个问题。我现在能够使用非常量整数值和变量来初始化我的Pvector,即使没有第二个构造函数。 – JohnTravolski

2

您可能会得到narrowing conversion warning,对吧?

被盗从here

C++ 11 8.5.4/7收缩转换是隐式转换 [...]从整数类型[...],以一个浮点类型,除非源代码是一个常量表达式并且转换后的实际值将适合目标类型,并在转换回原始类型时生成原始值。

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

+0

谢谢,我感谢额外的信息。你是对的,那是我收到的警告。 – JohnTravolski