2017-08-25 136 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