C++ 处理无效函数参数的最佳实践?

C++ 处理无效函数参数的最佳实践?,c++,C++,处理无效函数参数的最佳方法是什么?(我知道没有最好的方法,因为这取决于具体情况,但这里把“最佳”理解为“一种常见做法”) 假设我有这个函数 template<typename T> std::pair<T,T> min_max(const T* v, const size_t n){ if(n <= 0){ throw std::invalid_argument("Array of size zero passed as argument."

处理无效函数参数的最佳方法是什么?(我知道没有最好的方法,因为这取决于具体情况,但这里把“最佳”理解为“一种常见做法”)

假设我有这个函数

template<typename T> std::pair<T,T> min_max(const T* v, const size_t n){
    if(n <= 0){
        throw std::invalid_argument("Array of size zero passed as argument.");
    }
    T min = v[0], max = v[0];
    for(size_t i = 0;i < n;++i){
        if(v[i] < min){
            min = v[i];
        }
        if(v[i] > max){
            max = v[i];
        }
    }
    return std::make_pair<T,T>(min, max);
}
模板标准::对最小值最大值(常数T*v,常数大小n){
如果(n最大值){
max=v[i];
}
}
返回标准::生成一对(最小值、最大值);
}
它返回数组v中包含最小值和最大值的一对。但是如果大小n小于或等于零,则没有要提取的值,因此我不能真正返回任何值。我是否应该抛出异常(如本例中所做的)


谢谢。

你的功能,你的语义。只要记得把它们记录好就行了。您可能对我在一篇文章中讨论的一些选项感兴趣。
size\u t
是一种无符号类型。它不能小于零,因此您最好将
t
的相等性与零进行比较。在IMO中,如果先决条件已被记录,并且调用方可以合理地确保满足这些先决条件,则抛出是正确的做法。如果不需要,可以将函数重命名为类似于
try\u min\u max
的名称,并返回类似于
boost::optional
的名称。然而,你却给行为良好的来电者增加了额外的工作负担,以容纳行为不好的来电者。陈雷蒙(Raymond Chen)不得不谈谈这个话题。关于这个问题,有两大流派。在防御性编程中,您肯定会验证所有输入。在契约式设计中,您明确指定方法的有效输入是什么,并将其留给调用方,以确保使用有效参数调用方法。