使用Ints的初始化列表初始化长双打的向量

时间:2017-08-25 05:35:36

标签: c++ list vector initialization

假设我有一个简单的类:

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)
  {}
};

这将无法编译,因为类型std::vector上模板化的long double无法从类型int上模板化的初始化列表初始化自身。但是,这很不方便,因为删除了第二个构造函数后,我无法在代码中执行以下操作:

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

这是因为算术运算的结果类型是int类型。所以我似乎陷入了一个难题。我希望能够将整数直接传递给Pvector的构造函数,但我仍然希望point_listlong double类型,并且(不知何故)使用我传递的整数进行初始化我怎么可能这样做?

2 个答案:

答案 0 :(得分: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};
}

答案 1 :(得分:2)

你可能得到#include <limits> #include <type_traits> enum class EventOrder { Last = 1'000'000, Default = 0, Logger = -1024, First = -1'000'000 }; template <typename T> constexpr inline std::underlying_type_t<T> num(T value) { static_assert(std::is_enum<T>::value, "num can only be used on enumeration types"); return static_cast<std::underlying_type_t<T>>(value); } template< typename T > constexpr bool LimitedValue(const T value, const T min, const T max) { return value >= min && value <= max; } template <EventOrder orderl, std::underlying_type_t<EventOrder> orderr> constexpr std::underlying_type_t<EventOrder> orderSum() { return num(orderl) + orderr; } template <EventOrder orderl, std::underlying_type_t<EventOrder> orderr> constexpr EventOrder order() { static_assert(LimitedValue(orderSum<orderl, orderr>(), num(EventOrder::First), num(EventOrder::Last)), "order out of baunds"); return static_cast<EventOrder>(orderSum<orderl, orderr>()); } int main() { EventOrder e = order<EventOrder::Default, 2>(); } ,对吗?

here被盗:

  

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

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