考慮以下功能:一些模板的Emit編譯錯誤參數
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呢?
考慮以下功能:一些模板的Emit編譯錯誤參數
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")
只是爲了完整性,這裏是如何能夠做到(基本上,沒有消息)在純C++ 03類似,它是如何工作的提升:
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>);
}
你不需要'? true:false'。 – 0x499602D2
@ 0x499602D2對,從提升中一味地複製 – Ruslan
你不需要'f'中的return語句嗎? – 0x499602D2
另一種方法是包裹函數類模板,條件是不支持的模板的參數值偏特:
#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;
}
看看Boost.StaticAssert。 – Aleph