考虑以下功能:
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呢?
答案 0 :(得分:2)
您可以使用BOOST.StaticAssert
:
#include <boost/static_assert.hpp>
BOOST_STATIC_ASSERT_MSG(N == 5, "N=5 is not supported!\n")
答案 1 :(得分: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;
}
答案 2 :(得分: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>);
}