我写了一个函数:
template<int N> void tryHarder() {
for(int i = 0; i < N; i++) {
tryOnce();
}
}
但我只希望它在 N 介于 0 和 10 之间时编译。我可以这样做吗?如何?
我写了一个函数:
template<int N> void tryHarder() {
for(int i = 0; i < N; i++) {
tryOnce();
}
}
但我只希望它在 N 介于 0 和 10 之间时编译。我可以这样做吗?如何?
您可以通过static_assert
声明来做到这一点:
template<int N> void tryHarder() {
static_assert(N >= 0 && N <= 10, "N out of bounds!");
for(int i = 0; i < N; i++) {
tryOnce();
}
}
此功能仅在 C++11 之后可用。如果您对 C++03 感到困惑,请查看Boost 的静态断言宏。
整个想法都是很好的错误消息。如果您不关心这些,或者甚至无法提供提升,您可以执行以下操作:
template<bool B>
struct assert_impl {
static const int value = 1;
};
template<>
struct assert_impl<false> {
static const int value = -1;
};
template<bool B>
struct assert {
// this will attempt to declare an array of negative
// size if template parameter evaluates to false
static char arr[assert_impl<B>::value];
};
template<int N>
void tryHarder()
{
assert< N <= 10 >();
}
int main()
{
tryHarder<5>(); // fine
tryHarder<15>(); // error, size of array is negative
}
对于 C++11 之前的编译器,您可以在非类型参数 N 上实现模板参数约束。
有关如何执行此操作的说明,请参阅http://stroustrup.com/bs_faq2.html#constraints
unsigned int
结合到目前为止已经给出的答案,也可以通过使用模板类型来覆盖下限。负值(如果应用)将被转换为足够高的无符号值,以至于static_assert
无论如何它们都将被 C++11 之前的解决方案所覆盖。
unsigned int
另外已经在语义上给出了一个提示,即不应将负值应用于此模板,这就是为什么在特定情况下(可能)应该首选它的原因......
#if !defined(__cplusplus)
#error C++ compiler required.
#endif
这只是一个例子。
这是源链接: http: //msdn.microsoft.com/en-us/library/c8tk0xsk (v=vs.71).aspx
我要说的是你也可以使用#error
这是一个指令
编辑@Pratik Chowdhruy:我同意 Paul R。这并不能直接回答问题。对不起社区