簡體   English   中英

使用Ints的初始化列表初始化長雙打的向量

[英]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的構造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使用模板構造函數,並使用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};
}

您可能會收到一個narrowing conversion warning ,對吧?

這里來的

C ++ 11 8.5.4 / 7 變窄轉換是從整數類型到浮點類型的隱式轉換, 除非源是常量表達式而后是實際值轉換將適合目標類型,並在轉換回原始類型時生成原始值。

因此,每次將非常量整數表達式(即變量)轉換為浮點類型時,您都會收到此警告。 該值是否適合相應類型的尾數將取決於類型(float,double,long-double)和類型的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM