0

考虑以下函数:

template<int N> f()
{
    if(N==5)
    {
        std::cerr << "N=5 is not supported!\n";
        abort();
    }
    do_real_work(N);
}

如何将运行时错误消息转换为编译时错误?如果我使用 C++11,我想我可以使用static_assert,但是 C++03 呢?

4

3 回答 3

2

您可以使用BOOST.StaticAssert

#include <boost/static_assert.hpp>

BOOST_STATIC_ASSERT_MSG(N == 5, "N=5 is not supported!\n")
于 2013-10-19T13:44:22.877 回答
1

另一种方法是将函数包装在类模板中,对不支持的模板参数值进行部分特化:

#include <iostream>

template <int N>
struct wrapper {
    static int f() {
        return N;
    }
};

template <>
struct wrapper<5> {
};

int main() {
    std::cout << wrapper<4>::f() << '\n';
    return 0;
}
于 2013-10-19T15:18:19.997 回答
0

只是为了完整起见,下面是在纯 C++03 中的实现方式(基本上,没有消息),类似于它在 boost 中的工作方式:

template <bool x> struct STATIC_ASSERTION_FAILURE;

template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };

template<int n> void f()
{
    sizeof(STATIC_ASSERTION_FAILURE<n==5>);
}
于 2013-10-19T14:42:16.077 回答