gpt4 book ai didi

c++ - 依赖从任何数字类型(unsigned、int、...)到 double 的隐式提升是否安全?

转载 作者:太空狗 更新时间:2023-10-29 21:16:23 26 4
gpt4 key购买 nike

我有一个图形模板类,它采用权重类型的参数(可以是无符号、整数或 double )。此外,为了比较 double ,我使用以下类型的内联函数:

inline bool EpsLess(double x, double y, double epsilon = 1.e-10)
{
return x < y - epsilon;
}
inline bool EpsEqual(double x, double y, double epsilon = 1.e-10)
{
return !EpsLess(x,y) && !EpsLess(y,x);
}

下面类骨架中的比较器安全吗?

template <typename Weight>
class Graph
{
struct Edge
{
std::string from;
std::string to;
Weight weight;
};

struct LargestWeight
{
bool operator() (const Edge& e1, const Edge& e2) const
{
if (EpsEqual(e1.weight == e2.weight))
if (e1.from == e2.from)
return e1.to < e2.to;
else
return e1.from < e2.from;
return EpsLess(e2.weight, e1.weight);
}
};

// .. other stuff
};

当 Weight 类型为 unsigned 或 int 时,我会遇到无法预料的后果吗?还是有更好的方法来实现双重比较?

最佳答案

这正是模板的用途。

我建议您实现 EpsLess () 在仅使用 < 的模板类中和 ==运营商。像这样的东西:

template<typename Type> Compare {

public:

template<typename Ignore>
inline bool EpsLess(Type x, Type y, Ignore epsilon = Ignore())
{
return x < y;
}
};

然后将其特化为双倍:

template<> Compare<double> {

public:
inline bool EpsLess(double x, double y, double epsilon = 1.e-10)
{
return x < y - epsilon;
}
};

你会像这样调用它:

if (Compare<Weight>::EpsEqual(e1.weight, e2.weight))

这将避免对非双重情况进行大量无用的工作,并且将其转移到一个普通的 < 中。运营商。

那么,你的家庭作业是重新实现 EpsEqual () 作为模板函数本身,对于新的 EpsLess 而言().

关于c++ - 依赖从任何数字类型(unsigned、int、...)到 double 的隐式提升是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35200361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com