我们有一个算法库对可能是NaN的数字进行大量std::min
/ std::max
操作.考虑这篇文章:为什么Release/Debug对std :: min有不同的结果?,我们意识到它显然是不安全的.
有没有办法阻止开发人员使用std::min
/ std::max
?
我们的代码使用VS2015和g ++编译.我们的所有源文件都包含一个公共头文件(通过/FI
VS2015和-include
g ++的选项).是否有任何代码/编译指示可以放在这里使任何cpp文件使用std::min
或std::max
无法编译?
顺便说一下,使用此功能的遗留代码(如STL标头)不应受到影响.只有我们编写的代码才会受到影响.
Die*_*ühl 32
我不认为使标准库函数不可用是正确的方法.首先,NaN是浮点值如何工作的一个基本方面.你需要禁用其他各种事情,如sort()
,lower_bound()
等.此外,程序员支付的有创意,我怀疑任何程序员伸手std::max()
将毫不犹豫地使用a < b? b: a
,如果std::max(a, b)
不工作.
此外,您显然不希望禁用std::max()
或std::min()
没有NaN的类型,例如整数或字符串.所以,你需要一个有点控制的方法.
没有可移植的方法来禁用命名空间中的任何标准库算法std
.您可以通过提供合适的delete
d重载来定位这些算法的使用来破解它,例如:
namespace std {
float max(float, float) = delete; // **NOT** portable
double max(double, double) = delete; // **NOT** portable
long double max(long double, long double) = delete; // **NOT** portable
// likewise and also not portable for min
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*tti 18
我在这里有点哲学,而且代码更少.但我认为最好的方法是教育那些开发人员,并解释为什么他们不应该以特定的方式编码.如果你能够给他们一个很好的解释,那么他们不仅会停止使用你不想要的功能.他们将能够将消息传播给团队中的其他开发人员.
我相信强迫他们只会让他们想出来解决问题.
由于std
不允许修改,以下是UB,但可能适用于您的情况.将该函数标记为已弃用:
从c ++ 14开始,不推荐使用的属性:
namespace std
{
template <typename T>
[[deprecated("To avoid to use Nan")]] constexpr const T& (min(const T&, const T&));
template <typename T>
[[deprecated("To avoid to use Nan")]] constexpr const T& (max(const T&, const T&));
}
Run Code Online (Sandbox Code Playgroud)
之前
#ifdef __GNUC__
# define DEPRECATED(func) func __attribute__ ((deprecated))
#elif defined(_MSC_VER)
# define DEPRECATED(func) __declspec(deprecated) func
#else
# pragma message("WARNING: You need to implement DEPRECATED for this compiler")
# define DEPRECATED(func) func
#endif
namespace std
{
template <typename T> constexpr const T& DEPRECATED(min(const T&, const T&));
template <typename T> constexpr const T& DEPRECATED(max(const T&, const T&));
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4003 次 |
最近记录: |