有没有办法强迫"强迫"一个函数参数遵循C ++中的一些规则?
为了举例,我想写一个计算数学函数的n阶导数的函数。假设函数的签名是这个:
double computeNthDerivative(double x, unsigned int n);
现在,假设我想禁止用户为n输入0。如果用户输入为0,我可以使用assert
或测试值并throw
例外
但还有其他方法可以做这种事吗?
编辑:条件将在编译时设置,但必须在运行时进行检查。
答案 0 :(得分:5)
您可以使用模板阻止在编译时使用0
。
template <int N>
double computeNthDerivative(double x)
{
// Disallow its usage for 0 by using static_assert.
static_assert(N != 0, "Using 0 is not allowed");
// Implement the logic for non-zero N
}
为防止在运行时使用0
函数,最好抛出异常。
double computeNthDerivative(double x, unsinged int n)
{
if ( n == 0 )
{
throw std::out_of_range("Use of the function for n = 0 is not allowed.");
}
// Implement the logic for non-zero n
}
答案 1 :(得分:1)
我认为这里最好的方法是抛出异常。这就是例外情况,即使名称似乎暗示了这一点。
关于assert
宏,有一个重要的警告。如果使用assert
宏,如果不满足断言,程序将中止。但是,如果您在设置NDEBUG
宏的位置进行发布构建,则编译期间所有断言将删除。这意味着您无法使用此宏检查有效的用户输入(因为您应该构建版本构建)。
答案 2 :(得分:1)
class Policy {
private:
String myPolicy;
public :
Policy(String regEx) : myPolicy(regEx) {
}
void verify(int n) {
regEx strtok , sprintf, blah, blah n
};
class Asserted {
private:
Policy policy;
public:
Asserted(Policy policy, int n) throw AAAHHHHH {
policy.verify(n);
}
};
然后终于
Asserted assert = new Asserted(Policy("[1-9]", 8))
double computeNthDerivative(2.6, assert);
答案 3 :(得分:0)
唯一的规则是您放弃。如果用户是您想要限制的用户,则必须检查他们提供的内容。 对于函数也是如此,但是在您的情况下,您作为示例显示的最好是在cin(或您喜欢的任何imput)之后检查变量,而不是在函数本身中检查它。为此,我会去 如果n!= 0; 你的功能 别的休息;
答案 4 :(得分:0)
因此,如果您正在寻找基于“策略”的解决方案,您可以创建一个单独的类,该类接受定义的正则表达式(或您定义为策略的任何内容)和输入,在本例中为n
,然后将用作你的功能的输入。