考虑以下函数:
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 呢?
考虑以下函数:
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 呢?
您可以使用BOOST.StaticAssert
:
#include <boost/static_assert.hpp>
BOOST_STATIC_ASSERT_MSG(N == 5, "N=5 is not supported!\n")
另一种方法是将函数包装在类模板中,对不支持的模板参数值进行部分特化:
#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;
}
只是为了完整起见,下面是在纯 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>);
}