有没有办法阻止开发人员使用std :: min,std :: max?

jpo*_*o38 12 c++

我们有一个算法库对可能是NaN的数字进行大量std::min/ std::max操作.考虑这篇文章:为什么Release/Debug对std :: min有不同的结果?,我们意识到它显然是不安全的.

有没有办法阻止开发人员使用std::min/ std::max

我们的代码使用VS2015和g ++编译.我们的所有源文件都包含一个公共头文件(通过/FIVS2015和-includeg ++的选项).是否有任何代码/编译指示可以放在这里使任何cpp文件使用std::minstd::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.您可以通过提供合适的deleted重载来定位这些算法的使用来破解它,例如:

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)

  • @ sfk92fksdf:由于17.6.4.2.1 [namespace.std]第1段:"如果C++程序向命名空间std或命名空间std中的命名空间添加声明或定义,除非另有说明,否则C++程序的行为是未定义的.... "没有允许超载的规范.基本原因很简单,标准库可能使用这些功能,并且用户代码使用不同的定义是违反One Definition规则的. (8认同)
  • 这几乎完全依赖于未定义的行为. (3认同)
  • @Joshua另一个问题的问题是编译器决定切换比较...我不明白为什么即使使用内联条件编译器也不能这样做...或者有什么东西阻止编译器改变`x <y`到`y> = x`(对于花车)? (2认同)

Dav*_*tti 18

我在这里有点哲学,而且代码更少.但我认为最好的方法是教育那些开发人员,并解释为什么他们不应该以特定的方式编码.如果你能够给他们一个很好的解释,那么他们不仅会停止使用你不想要的功能.他们将能够将消息传播给团队中的其他开发人员.

我相信强迫他们只会让他们想出来解决问题.

  • 这个.加上一个很好的工作流程,即包含拉取请求的代码审查(例如:Github上的内容/ Bitbucket/...),这应该可以解决大部分问题 (3认同)

Jar*_*d42 7

由于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)

演示