我有一个像这样的函数:
int div_round_up(int x, int y) {
/**
* This function only works for positive divisor and non-negative dividend!!
*/
assert(y > 0 && x >= 0);
if (x == 0)
return 0;
return (x - 1) / y + 1;
}它不适用于y <= 0或x < 0。这是可以的,我甚至可以动态地检查正确的值,但是我想静态地检查,当有人输入错误的值时。如果我将x和y定义为无符号,它们就会从负值无声地转换为巨大的正值,这会产生错误的结果,所以我不想那样。我想让编译失败,当有人试图给它提供负值时,比如在div_round_up(variable, -7)中。我该怎么办?
发布于 2015-04-21 20:56:59
要在编译时验证一个数字(这就是static_assert所做的),必须在编译时知道它。要了解为什么需要这样做,请考虑一下类似于div_round_up(read_integer_from_file(), read_keyboard_character())的内容。这样做的明显缺点是,您必须在编译时知道数字。
最简单的方法是使它们成为模板参数,这允许您将函数的实现(几乎)保持不变:
template<int x, int y>
int div_round_up() {
static_assert(y > 0 && x >= 0, "This function only works for positive divisor and non-negative dividend");
if (x == 0)
return 0;
return (x - 1) / y + 1;
}它可以称为div_round_up<3, 4>()和 fires。
发布于 2015-04-21 21:02:28
如果您使用gcc或clang,您可以包括一个宏
#define div_round_up(a, b) (__builtin_constant_p(b) ? drus(a, b) : drud(a, b))和两个不同的函数,其中drus包含b的静态断言,而drud不包含。
发布于 2015-04-21 21:04:55
是的,你可以用一些魔法来做这件事(一位俄罗斯代码大师告诉我这个技巧)
#define check2(x) typedef char checkVal[(x)?1:-1];
int main() {
check2(3<4);
check2(5<4);
return 0;
}但在这种情况下也有一个限制。编译器应该知道这个值的结果。在任何另一种情况下,这是不可接受的(IMHO)。
https://stackoverflow.com/questions/29782741
复制相似问题