8

我写了一个函数:

template<int N> void tryHarder() {
    for(int i = 0; i < N; i++) {
        tryOnce();
    }
}

但我只希望它在 N 介于 0 和 10 之间时编译。我可以这样做吗?如何?

4

4 回答 4

14

您可以通过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
}
于 2013-04-24T12:57:40.700 回答
2

对于 C++11 之前的编译器,您可以在非类型参数 N 上实现模板参数约束。

有关如何执行此操作的说明,请参阅http://stroustrup.com/bs_faq2.html#constraints

于 2013-04-24T14:03:10.333 回答
1

unsigned int结合到目前为止已经给出的答案,也可以通过使用模板类型来覆盖下限。负值(如果应用)将被转换为足够高的无符号值,以至于static_assert无论如何它们都将被 C++11 之前的解决方案所覆盖。

unsigned int另外已经在语义上给出了一个提示,即不应将负值应用于此模板,这就是为什么在特定情况下(可能)应该首选它的原因......

于 2018-03-19T13:40:37.573 回答
-2
#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。这并不能直接回答问题。对不起社区

于 2013-04-24T12:59:56.733 回答