作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个函数只接受大于 0 的无符号整数,并有一个调试断言来检查它:
void foo(unsigned int x) {
assert(x > 0);
}
是否可以添加 static_assert
在这里,这样代码仍然可以编译并接受不是编译时常量的参数?
foo(0); // compilation error
foo(1); // fine
foo(get_x_from_user()); // fine
我知道我可以使 x 成为模板参数,但我更愿意保留这种调用方式:foo(5);
而不是 foo<5>();
.
我在想可能有一种方法可以使用自定义整数类型来实现这一点,但我无法在这条路上走得太远。有办法做到这一点吗?
最佳答案
据我所知,如果不引入某种模板,这是不可能的,例如:
template<int T>
class CustomInt
{
public:
static constexpr int value = T;
};
template<int val>
void check(CustomInt<val> /*k*/)
{
static_assert(CustomInt<val>::value > 0, "error!");
check(val);
}
void check(int k)
{
std::cout << "check";
}
int s()
{
volatile int x = 5;
return x;
}
int main() {
check(CustomInt<0>());
check(s());
return 0;
}
虽然这只是将模板移动到自定义类型。
关于c++ - 如果参数在编译时已知,我可以执行可选的 static_assert 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36937083/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!