【问题标题】:Initialize Vector of Long Doubles with Initialization List of Ints用 Int 的初始化列表初始化 Long Doubles 的向量
【发布时间】:2018-02-03 03:01:48
【问题描述】:

假设我有一个简单的类:

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 并且(以某种方式)用我传入的整数进行初始化。我该怎么做关于这样做?

【问题讨论】:

    标签: c++ list vector initialization


    【解决方案1】:

    解决方案 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};
    }
    

    【讨论】:

    • 我知道这一点,但是在传入整数类型的变量的情况下,我仍然不确定该怎么做。现在我想起来了,我想我可以将它们中的每一个静态转换为 long double,但这也不一定是最理想的解决方案。
    • @JohnTravolski,这对我来说不是很清楚。我不确定传入整数类型的变量是个问题。
    • 啊哈,您的第二个解决方案似乎已经解决了问题。即使没有第二个构造函数,我现在也可以使用非常量整数值和变量来初始化我的 Pvector。
    【解决方案2】:

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

    盗自here:

    C++11 8.5.4/7窄化转换是隐式转换 [...] 从整数类型 [...] 到浮点类型,除非源是常量表达式,并且转换后的实际值将适合目标类型并且将转换回原始类型时产生原始值。

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

    【讨论】:

    • 谢谢,非常感谢您提供的额外信息。你是对的,这就是我收到的警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2018-03-15
    • 1970-01-01
    相关资源
    最近更新 更多