假设我有一个简单的类:
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_list
为long double
类型,并且(不知何故)使用我传递的整数进行初始化我怎么可能这样做?
答案 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)和类型的实现。